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 :
-
Clause From externe : La première partie
from list in optionLists
itère à travers chaque liste de notre liste principale de listes (optionLists
). -
Clause From interne : La deuxième partie
from option in list
accède à chaqueOption
dans la liste actuelle. -
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 deoptionLists
. - La méthode
Any
vérifie s’il existe uneOption o
dans la liste actuellel
où laValue
correspond à laValue
de l’option actuelle.
- La condition
-
Ordonnancement des résultats : La clause
orderby option.Value
trie les objetsOption
résultants en fonction de leurValue
. -
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êmeValue
. 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.