Détermination des éléments communs dans plusieurs listes C#
Imaginez que vous ayez une collection de listes et que vous ayez besoin d'identifier les éléments présents dans chacune d'elles. Par exemple :
<code class="language-csharp">var list1 = new List<int>() { 1, 2, 3 }; var list2 = new List<int>() { 2, 3, 4 }; var list3 = new List<int>() { 3, 4, 5 }; var listOfLists = new List<List<int>>() { list1, list2, list3 };</code>
Le résultat souhaité est une liste contenant uniquement les éléments communs aux trois listes : {3}
.
Tirer parti de IEnumerable.Intersect()
avec un accumulateur de liste
Une méthode efficace consiste à utiliser IEnumerable.Intersect()
de manière itérative avec une liste faisant office d'accumulateur :
<code class="language-csharp">var intersection = listOfLists.Skip(1) .Aggregate( new List<int>(listOfLists.First()), (list, subList) => list.Intersect(subList).ToList() );</code>
Ce code commence par la première liste puis la croise de manière itérative avec chaque liste suivante.
Employer IEnumerable.Intersect()
avec un accumulateur HashSet
Une approche plus efficace utilise un HashSet
comme accumulateur, en raison de ses capacités d'intersection optimisées :
<code class="language-csharp">var intersection = listOfLists.Skip(1) .Aggregate( new HashSet<int>(listOfLists.First()), (h, e) => { h.IntersectWith(e); return h; } );</code>
Cette version utilise IntersectWith()
, une opération plus performante pour les ensembles. N'oubliez pas que listOfLists
doit contenir au moins une liste pour que cela fonctionne correctement.
Les deux techniques offrent des moyens efficaces de trouver l'intersection de plusieurs listes à l'aide de IEnumerable.Intersect()
. La méthode HashSet
est généralement préférée pour ses avantages en termes de performances lorsqu'il s'agit de jeux de données plus volumineux.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!