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:

  1. Cláusula From Externa: A primeira parte from list in optionLists itera através de cada lista em nossa lista principal de listas (optionLists).

  2. Cláusula From Interna: A segunda parte from option in list acessa cada Option dentro da lista atual.

  3. 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 a option atual é encontrada em todas as listas dentro de optionLists.
    • O método Any verifica se existe algum Option o na lista atual l onde o Value corresponde ao Value da option atual.
  4. Ordenação dos Resultados: A cláusula orderby option.Value ordena os objetos Option resultantes com base em seu Value.

  5. 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 mesmo Value. Se você precisar de Options ú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.