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:

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

Certo?
Agora dada a classe:

    public class Pessoa
    {
        public string Nome { get; set; }
        public int Idade { get; set; }
        public string Sexo { get; set; }

        // Construtor para facilitar a criação de uma nova pessoa.
        public Pessoa(string nome, int idade, string sexo)
        {
            Nome = nome;
            Idade = idade;
            Sexo = sexo;
        }

        // Construtor vazio para permitir uma instância vazia da classe Pessoa
        public Pessoa()
        {
        }
    }

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

    // Criando uma lista do tipo pessoa.
    List<Pessoa> listaPessoas = new List<Pessoa>();

    // Adicionando novas pessoas na lista.
    listaPessoas.Add(new Pessoa("Eduardo",30,"M"));

    listaPessoas.Add(new Pessoa("Enzo", 7, "M"));

    listaPessoas.Add(new Pessoa("Juliana", 21, "F"));

    // Obtendo o total de pessoas na lista
    int totalPessoas = listaPessoas.Count(); // totalPessoas = 3 pessoas

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

    // Criando uma lista do tipo pessoa.
    List<Pessoa> listaPessoas = new List<Pessoa>();

    // Criando um objeto pessoa vazio.
    Pessoa pessoaTeste = new Pessoa();

    // Preenchendo um objeto pessoa.
    pessoaTeste.Nome = "Eduardo";
    pessoaTeste.Idade = 30;
    pessoaTeste.Sexo = "M";

    // Adicionando a pessoa na lista.
    listaPessoas.Add(pessoaTeste);

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

    public static void MetodoAumentaIdade(List<Pessoa> listaPessoas)
    {
        foreach(Pessoa pessoa in listaPessoas)
        {
            // Aumenta 1 ano de idade.
            pessoa.Idade++;
        }
    }

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:

    // Criando uma nova lista e ordenando por nome decrescente
    List<Pessoa> novaListaPessoas;
    novaListaPessoas = listaPessoas.OrderByDescending(x => x.Nome).ToList();

    // Varrendo e exibindo nomes ordenados
    novaListaPessoas.ForEach(n => Console.Write(n.Nome));

    // Criando uma nova lista baseada em pessoas selecionadas por um critério
    List<Pessoa> listaPessoaSelecionada =
                (from Pessoa p in novaListaPessoas where p.Nome == "Eduardo"
                select p).ToList();

    // Somando todas as idades das pessoas da lista
    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 😉

25 ideias sobre “C# – Para Iniciantes – Parte 7 – Generics C#

  1. Caro Eduardo não entendi o que significa o x em :

    // Criando uma nova lista e ordenando por nome decrescente
    // List novaListaPessoas;
    // novaListaPessoas = listaPessoas.OrderByDescending(x => x.Nome).ToList();

    • Olá Allan,

      Expressões Lambda são assim mesmo, possuem essa sintaxe meio fora do comum. O “x” é o argumento, pode ser “x”, “y”, “j”, tanto faz, você define como um apelido, quando o “x” acompanhado do operador lambda “=>” em seguida, significa que você quer fazer realizar uma expressão com base no contexto:

      int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
      int oddNumbers = numbers.Count(n => n % 2 == 1);

      O “n” nesse caso é uma representação do seu contexto, que é o array “numbers”.
      Entendo sua duvida, faz parte da sintaxe das expressões lambda, o que importa é você entender como identificar as partes, segue um trecho do artigo para frisar o que estamos falando:

      Uma expressão lambda sempre consiste de duas partes (esquerda e direita) separadas pelo “=>”. A parte à esquerda do “=>” contém uma lista de argumentos (de tipo não necessariamente definido, pois os tipos podem ser automaticamente indicados pelo compilador). O lado direito contém as instruções.

      Consegui te ajudar?

  2. Olá Eduardo,
    É a minha primeira vez aqui na sua página, e confesso que estou impressionado pela didática usada, simples e de fácil compreensão. Parabéns cara, sanou completamente as minhas dúvidas sobre Generics (estava me fazer bastante confusão). Sempre que tiver dúvidas consultarei!

  3. Fala Eduardo! Parabéns pelos seus ensinamentos.
    Seria muito valido adicionar ao curso de iniciantes em C# as diferenças entre List, ArrayList, Array, Colletions (e se tiver outros parecidos). Para esclarecer definitivamente essas duvidas, minhas e acredito que de outras pessoas.

    Obrigado!

    Abraços

  4. Primeiramente te parabenizo pela atitude de disseminar conhecimento, isso esta cada vez mais difícil nos tempos atuais.
    Estou com uma dificuldade em carregar uma List, em meu código, se puder me dar uma luz te agradeço.
    A Situação é a seguinte possuo uma classe cliente, e carrego ela com dados da tela através de um botão, feito isso adiciono a uma coleção essa classe, e utilizo essa coleção para popular um grid, porem, ao adicionar um novo registro o grid não acrescenta linhas apenas substitui os dados, e na row count da coleçao aparece apena 1 linha.
    oque pode estar acontecendo de errado.

  5. Parabéns Eduardo, estou impressionado com a clareza e simplicidade com que você consegue ensinar, fazendo parecer fácil assuntos complexos.
    Como a biblia diz: “melhor é dar do que receber”, obrigado por compartilhar o conhecimento, Deus abençoe.

  6. Pingback: Série C# para Iniciantes | unnygames

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *