Como Usar LINQ para Recuperar Valores Distintos de Propriedades de Listas em Memória

Trabalhar com coleções em C# é uma tarefa comum, especialmente ao lidar com diferentes propriedades de objetos. Um requisito frequente é extrair valores únicos de uma lista de forma eficiente. Neste post, abordaremos uma pergunta comum enfrentada por muitos desenvolvedores: Como posso obter um array de valores distintos de propriedades de uma lista em memória usando LINQ?

Entendendo o Problema

Imagine que você tem uma lista de objetos de uma classe chamada Foo. Cada objeto Foo possui uma propriedade de string chamada Bar, e você deseja reunir todos os valores únicos de Bar desta lista. O desafio é alcançar isso sem uma complexidade excessiva e de uma forma que seja eficiente e sustentável.

O Cenário

  1. Você tem uma List<Foo>.
  2. Cada objeto Foo tem uma propriedade Bar do tipo string.
  3. Você quer obter um string[] contendo apenas os valores distintos das propriedades Bar de todas as instâncias de Foo.

A Solução

Para extrair eficazmente os valores distintos de Bar de uma lista de objetos Foo, você pode utilizar o poder do LINQ. Veja como fazer isso:

Usando LINQ para Extrair Valores Distintos

Aqui está uma maneira simples e elegante de alcançar seu objetivo usando LINQ:

var bars = Foos.Select(f => f.Bar).Distinct().ToArray();

Analisando o Código

  1. Foos.Select(f => f.Bar): Esta parte do código é uma expressão lambda que projeta cada objeto Foo em sua propriedade Bar.
  2. .Distinct(): Esta chamada de método filtra o resultado para retornar apenas valores únicos, eliminando efetivamente duplicatas da seleção.
  3. .ToArray(): Finalmente, ToArray() converte o resultado do IEnumerable em um array de strings.

Considerações Importantes

  • Execução Adiada: Consultas LINQ não são executadas até que você consuma seus resultados explicitamente. Ao usar métodos como ToArray() ou Count(), você aciona a avaliação da consulta.
  • Otimizações: É aconselhável construir suas consultas completamente antes de forçar a avaliação com ToArray(), pois o LINQ pode aplicar otimizações durante o processo de execução.

Conclusão

Usar LINQ não apenas simplifica o processo de extração de valores distintos de propriedades, mas também garante que seu código seja limpo e sustentável. Estruturando adequadamente suas consultas, você pode aproveitar efetivamente as capacidades do LINQ para otimizar o desempenho.

Agora, da próxima vez que você precisar extrair valores distintos de uma lista em C#, você pode aplicar essa abordagem direta com confiança!