C# - Usando Listas com elegância

 Neste artigo vou mostrar como tratar lista de objetos usando a linguagem C#.


É muito comum trabalhar com listas de objetos, e, no passado tratar listas de objetos dava muito trabalho. A linguagem C#, a partir da sua versão 2.0, incluiu muitos recursos que fez com que o tratamento de listas de objetos se tornasse algo muito simples. Vamos recordar um pouco esse assunto neste artigo.

Eu estou usando o VS Community 2017 e a versão 7.0 da linguagem C#, com o .NET Framework 4.6,  mas o código pode ser executado em versões anteriors.

Vamos imaginar que você tenha uma classe Pessoa definida com o seguinte código:

    public class Pessoa
    {
        public Pessoa() {}

        public string Nome { get; set; }
        public int Idade { get; set; }

        public Pessoa(int idade, string nome)
        {
            this.Idade = idade;
            this.Nome = nome;
        }
    }

Nota: Note que temos dois construtores na classe Pessoa.

Veja como é simples criar uma lista de objetos Pessoa e listar o seu conteúdo :

using System;
using System.Collections.Generic;

    class Program
    {
        static List<Pessoa> pessoas;

        static void Main(string[] args)
        {
            pessoas = new List<Pessoa>();
            pessoas.Add(new Pessoa(50, "Macoratti"));
            pessoas.Add(new Pessoa(25, "Jefferson"));
            pessoas.Add(new Pessoa(45, "Miriam"));
            pessoas.Add(new Pessoa(null, null));
            foreach (Pessoa p in pessoas)
            {
                Console.WriteLine(p.Nome + " " + p.Idade);
            }
            Console.ReadKey();
        }
    }

Usamos a classe List<T> que representa uma lista fortemente tipada de objetos do tipo Pessoa que podem ser acessados pelo seu índice, e, usei o método Add() para incluir objetos no fim da lista.

A classe List<T> também fornece uma série de métodos que vão facilitar muito sua vida. Dentre eles eu destaco os métodos : ForEach, FindAll, Find e Sort.

  1. ForEach nos permite acessar cada item na lista iterando sobre ele;
  2. FindAll permite procurar por objetos na lista que correspondem a uma condição específica;
  3. Find permite procurar por um elemento na lista que corresponde a uma condição específica retornando a primeira ocorrência;
  4. Sort permite classificar os objetos da lista;

Vejamos esses métodos em ação.

1- Lista não ordenada

      static void ListaNaoOrdenada()
      {
            Console.WriteLine("Lista não ordenada");
            pessoas.ForEach(delegate (Pessoa p)
            { 
                 Console.WriteLine(String.Format("{0} {1}", p.Idade, p.Nome)); 
             });
       }

Para obter lista não ordenada basta percorrer a lista usando um ForEach.

2- Lista ordenada por nome

        static void ListaOrdenadaPorNome()
        {
            Console.WriteLine("Lista Ordenada por Nome");
            pessoas.Sort(delegate (Pessoa p1, Pessoa p2)
            {
                return p1.Nome.CompareTo(p2.Nome);
            });
            pessoas.ForEach(delegate (Pessoa p)
            {
                Console.WriteLine(String.Format("{0} {1}", p.Idade, p.Nome));
            });
        }

Aqui o método Sort() classifica os elementos em toda lista usando o comparador padrão.

3- Lista ordenada por idade

        static void ListaOrdenadaPorIdade()
        {
            Console.WriteLine("Lista Ordenada por Idade");
            pessoas.Sort(delegate (Pessoa p1, Pessoa p2)
            {
                return p1.Idade.CompareTo(p2.Idade);
            });
            pessoas.ForEach(delegate (Pessoa p)
            {
                Console.WriteLine(String.Format("{0} {1}", p.Idade, p.Nome));
            });
        }

Aqui o método Sort() classifica os elementos em toda lista usando o comparador padrão.

4- Inserir um item na lista em uma posição do índice

        static void ListaInserirItemNaPosicao()
        {
            Console.WriteLine("Inserindo uma pessoa na posição 1 e outra na posição 3");
        
            pessoas.Insert(1, new Pessoa() { Nome = "Bob Dylan", Idade = 78 });
            pessoas.Insert(3, new Pessoa() { Nome = "Jimmi Page", Idade = 81 });
        }

O método Insert() insere o elemento na lista em uma posição especificada.

5- Remover um item da lista

        static void ListaRemoverItem()
        {
            Console.WriteLine("Removendo objeto Pessoa :  Nome=Macoratti, Idade=45");
            pessoas.Remove(new Pessoa() { Idade = 45 , Nome = "Macoratti" });
        }

O método Remove() remove a primeira ocorrência de um objeto específico.

6- Verificar se existe um item na lista

        static void ListaVerificarSeItemExiste()
        {
            Console.WriteLine("\nExiste na Lista Pessoa com Idade igual a 78 : {0}",
                pessoas.Exists(p => p.Idade == 78));
        }

O método Exists() determina se a List<T> contém objetos que combinam as condições definidas pelo predicado especificado.

O método string.Join combina cadeias de caracteres em uma única. Ele recebe dois argumentos: um array (ou IEnumerable) e uma seqüência separadora.

7- Converter a lista para um Array

        static void ListaConverterParaArray()
        {
            Console.WriteLine("Convertendo a lista para um Array");
            Pessoa[] ListaArray = pessoas.ToArray();
            foreach (Pessoa p in ListaArray)
            {
                Console.WriteLine(p.Nome + " "+ p.Idade);
            }
        }

O método ToArray() copia os elementos da List<T> para um novo array.

8- Localizar a pessoa mais jovem na lista

        static void ListaLocalizaPessoaMaisJovem()
        {
            List<Pessoa> jovem = pessoas.FindAll(delegate (Pessoa p) { return p.Idade < 25; });

            Console.WriteLine("Idade é menor que 25 : ");
            jovem.ForEach(delegate (Pessoa p)
            {
                Console.WriteLine(String.Format("{0} {1}", p.Idade, p.Nome));
            });
        }

O método FindAll recupera todos os elementos que combinam as condições definidas pelo predicado especificado.

Segue abaixo o resultado obtido executando todos os métodos acima:

Pegue o projeto completo aqui:   CShp_Listas.zip

E agora, filhinhos, permanecei nele(Jesus); para que, quando ele se manifestar, tenhamos confiança, e não sejamos confundidos por ele na sua vinda. 1 João 2:28

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti