Método Mais Rápido para Encontrar Itens Comuns em Múltiplas Listas em C#
Ao trabalhar com coleções em C#, você pode frequentemente se deparar com situações em que precisa encontrar elementos comuns em várias listas. Isso é particularmente útil quando você deseja filtrar resultados com base em critérios específicos. Neste post do blog, abordaremos um cenário comum: como identificar rapidamente um subconjunto de objetos Option
que aparecem em cada lista dentro de uma lista de listas.
Declaração do Problema
Imagine que você tem uma lista de listas, especificamente uma estrutura como List<List<Option>> optionLists
. Você precisa determinar quais objetos Option
estão presentes em todas as N
listas. Para resolver isso, precisamos estar cientes de que a igualdade dos objetos Option
é determinada por uma propriedade de string específica, como option1.Value == option2.Value
. No final, queremos retornar uma List<Option>
onde cada item apareça apenas uma vez.
A Solução: Encontrando Opções Comuns
Para enfrentar esse problema, podemos utilizar LINQ (Consulta Integrada de Linguagem) em C#. LINQ proporciona uma maneira poderosa de consultar coleções, tornando-o ideal para o nosso caso de uso. Abaixo está um trecho de código eficaz que realiza essa tarefa:
var x = from list in optionLists
from option in list
where optionLists.All(l => l.Any(o => o.Value == option.Value))
orderby option.Value
select option;
Explicação do Código
Vamos detalhar a consulta LINQ passo a passo:
-
Cláusula From Externa: A primeira parte
from list in optionLists
itera através de cada lista em nossa lista principal de listas (optionLists
). -
Cláusula From Interna: A segunda parte
from option in list
acessa cadaOption
dentro da lista atual. -
Cláusula Where: Esta é a parte crucial da solução:
- A condição
where optionLists.All(l => l.Any(o => o.Value == option.Value))
verifica se aoption
atual é encontrada em todas as listas dentro deoptionLists
. - O método
Any
verifica se existe algumOption o
na lista atuall
onde oValue
corresponde aoValue
daoption
atual.
- A condição
-
Ordenação dos Resultados: A cláusula
orderby option.Value
ordena os objetosOption
resultantes com base em seuValue
. -
Cláusula Select: Finalmente,
select option
reúne todas as opções elegíveis em uma coleção.
Considerações Importantes
-
Valores Distintos: O código fornecido não inclui uma seleção distinta, o que significa que ele pode retornar vários objetos
Option
com o mesmoValue
. Se você precisar deOptions
únicos, considere adicionar.Distinct()
à sua consulta. -
Desempenho: Dependendo do tamanho de suas listas, a eficiência dessa abordagem é significativa. As consultas LINQ são otimizadas e podem ter um bom desempenho com conjuntos de dados de tamanho moderado.
Conclusão
Encontrar itens comuns em várias listas pode ser eficientemente alcançado em C# usando LINQ, conforme ilustrado em nosso exemplo. Ao aproveitar o poder do LINQ, podemos realizar consultas complexas com um esforço de codificação mínimo. Isso não apenas acelera seu processo de codificação, mas também melhora a legibilidade e a manutenibilidade do seu código.
Agora que você está equipado com esse conhecimento, pode implementar facilmente tais soluções em seus projetos, tornando seu manuseio de coleções mais simples e eficiente.