Progamando, Tutorial

C# – Para Iniciantes – Parte 7 – Generics C#

Olá Pessoal, Vamos falar sobre Generics C#.

Atendendo a um pedido de um leitor que segue a série C# para iniciantes, faremos aqui uma abordagem simples para entender sobre o tal Generics 🙂

Os Generics (Genéricos) foram incluídos no .Net Framework na versão 2.0 (isso foi em 2005), portanto é novidade apenas para quem está começando agora, hoje em dia os Generics são fundamentais, então sugiro que entendam bem o conceito.

Os Generics foram criados para eliminar o “casting“, facilitar a criação de classes e métodos e diminuir a quantidade de boxing (entenda o que é boxing).
Genérics representa uma coleção (lista, array, como preferir…) de objetos fortemente tipados. Uma collection de generics fornece métodos para pesquisar, ordenar e manipular através de um índice.

Fortemente tipados, pois é uma coleção de um tipo, (int, string, etc… ou T), sendo “T” nesse caso um tipo definido pelo próprio programador.

Para utilizar o generics é necessário fazer uso do namespace System.Collections.Generic

Exemplo, uma lista de int:

1 List<int> listaInteiros = new List<int>();

Certo?
Agora dada a classe:

1 public class Pessoa
2 {
3     public string Nome { get; set; }
4     public int Idade { get; set; }
5     public string Sexo { get; set; }
6
7     // Construtor para facilitar a criação de uma nova pessoa.
8     public Pessoa(string nome, int idade, string sexo)
9     {
10         Nome = nome;
11         Idade = idade;
12         Sexo = sexo;
13     }
14
15     // Construtor vazio para permitir uma instância vazia da classe Pessoa
16     public Pessoa()
17     {
18     }
19 }

A classe Pessoa foi escrita pelo programador, não é um tipo do .Net, nesse caso para montar uma lista de N pessoas, seria assim:

1 // Criando uma lista do tipo pessoa.
2 List<Pessoa> listaPessoas = new List<Pessoa>();
3
4 // Adicionando novas pessoas na lista.
5 listaPessoas.Add(new Pessoa("Eduardo",30,"M"));
6
7 listaPessoas.Add(new Pessoa("Enzo", 7, "M"));
8
9 listaPessoas.Add(new Pessoa("Juliana", 21, "F"));
10
11 // Obtendo o total de pessoas na lista
12 int totalPessoas = listaPessoas.Count(); // totalPessoas = 3 pessoas

Fazendo a mesma coisa, só que de forma diferente:

1 // Criando uma lista do tipo pessoa.
2 List<Pessoa> listaPessoas = new List<Pessoa>();
3
4 // Criando um objeto pessoa vazio.
5 Pessoa pessoaTeste = new Pessoa();
6
7 // Preenchendo um objeto pessoa.
8 pessoaTeste.Nome = "Eduardo";
9 pessoaTeste.Idade = 30;
10 pessoaTeste.Sexo = "M";
11
12 // Adicionando a pessoa na lista.
13 listaPessoas.Add(pessoaTeste);

Escrevendo um método que recebe uma lista genérica de Pessoas e trabalha os dados da lista:

1 public static void MetodoAumentaIdade(List<Pessoa> listaPessoas)
2 {
3     foreach(Pessoa pessoa in listaPessoas)
4     {
5         // Aumenta 1 ano de idade.
6         pessoa.Idade++;
7     }
8 }

Estes exemplos mostraram como criar uma lista genérica.
Agora que sabemos como criar e popular uma lista genérica, vou dar alguns exemplos de como trabalhar dados em listas:

1 // Criando uma nova lista e ordenando por nome decrescente
2 List<Pessoa> novaListaPessoas;
3 novaListaPessoas = listaPessoas.OrderByDescending(x => x.Nome).ToList();
4
5 // Varrendo e exibindo nomes ordenados
6 novaListaPessoas.ForEach(n => Console.Write(n.Nome));
7
8 // Criando uma nova lista baseada em pessoas selecionadas por um critério
9 List<Pessoa> listaPessoaSelecionada =
10             (from Pessoa p in novaListaPessoas where p.Nome == "Eduardo"
11             select p).ToList();
12
13 // Somando todas as idades das pessoas da lista
14 int totalIdades = novaListaPessoas.Sum(x => x.Idade);

Notem que estou fazendo bastante uso de Expressões Lambdas.
Existem várias abordagens possíveis para trabalhar uma lista genérica, nesta documentação da Microsoft é possível estudar todas e aprender quando e de que forma podemos facilitar nosso trabalho utilizando Generics.

É isto pessoal, utilizem os comentários para participar ou tirar dúvidas.

Até mais 😉