La façon la plus rapide de trouver des éléments communs à plusieurs listes en C#

Lorsque vous travaillez avec des collections en C#, vous pouvez souvent rencontrer des situations où vous devez trouver des éléments communs à plusieurs listes. Cela est particulièrement utile lorsque vous souhaitez filtrer les résultats en fonction de critères spécifiques. Dans cet article de blog, nous allons aborder un scénario courant : comment identifier rapidement un sous-ensemble d’objets Option qui apparaissent dans chaque liste d’une liste de listes.

Énoncé du problème

Imaginez que vous avez une liste de listes, spécifiquement une structure comme List<List<Option>> optionLists. Vous devez déterminer quels objets Option sont présents dans toutes les N listes. Pour résoudre ce problème, nous devons être conscients que l’égalité des objets Option est déterminée par une propriété de chaîne spécifique, comme option1.Value == option2.Value. En fin de compte, nous voulons retourner une List<Option> où chaque élément apparaît une seule fois.

La solution : trouver des options communes

Pour aborder ce problème, nous pouvons utiliser LINQ (Language Integrated Query) en C#. LINQ fournit une manière puissante de interroger les collections, ce qui le rend idéal pour notre cas d’utilisation. Ci-dessous se trouve un extrait de code efficace qui accomplit cela :

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;

Explication du code

Décomposons la requête LINQ étape par étape :

  1. Clause From externe : La première partie from list in optionLists itère à travers chaque liste de notre liste principale de listes (optionLists).

  2. Clause From interne : La deuxième partie from option in list accède à chaque Option dans la liste actuelle.

  3. Clause Where : C’est la partie cruciale de la solution :

    • La condition where optionLists.All(l => l.Any(o => o.Value == option.Value)) vérifie si l’option actuelle est trouvée dans toutes les listes de optionLists.
    • La méthode Any vérifie s’il existe une Option o dans la liste actuelle l où la Value correspond à la Value de l’option actuelle.
  4. Ordonnancement des résultats : La clause orderby option.Value trie les objets Option résultants en fonction de leur Value.

  5. Clause Select : Enfin, select option recueille toutes les options éligibles dans une collection.

Considérations importantes

  • Valeurs distinctes : Le code fourni n’inclut pas de sélection distincte, ce qui signifie qu’il peut retourner plusieurs objets Option avec la même Value. Si vous avez besoin d’Options uniques, envisagez d’ajouter .Distinct() à votre requête.

  • Performance : Selon la taille de vos listes, l’efficacité de cette approche est significative. Les requêtes LINQ sont optimisées et peuvent bien performer avec des ensembles de données de taille modérée.

Conclusion

Trouver des éléments communs à plusieurs listes peut être réalisé efficacement en C# en utilisant LINQ, comme illustré dans notre exemple. En tirant parti de la puissance de LINQ, nous pouvons exécuter des requêtes complexes avec un minimum d’effort de codage. Cela accélère non seulement votre processus de codage, mais améliore également la lisibilité et la maintenabilité de votre code.

Maintenant que vous êtes équipé de ce savoir, vous pouvez facilement mettre en œuvre de telles solutions dans vos projets, rendant votre gestion des collections plus simple et plus efficace.