Verwenden Sie IEnumerable.Intersect(), um die Schnittmenge mehrerer Listen zu finden
Mit der Methode IEnumerable.Intersect() in C# können Sie gemeinsame Elemente in zwei Sequenzen finden. Was aber, wenn Sie über mehrere Listen verfügen und Elemente identifizieren möchten, die in allen Listen vorhanden sind?
Frage:
Gegeben eine Liste von Listen mit ganzen Zahlen:
<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>
Wie verwende ich IEnumerable.Intersect(), um die Schnittmenge dieser Listen zu finden und das Ergebnis List
Lösung 1: HashSet-Aggregation
<code class="language-csharp">var intersection = listOfLists .Skip(1) .Aggregate( new HashSet<int>(listOfLists.First()), (h, e) => { h.IntersectWith(e); return h; } );</code>
Diese Lösung verwendet die Aggregate()-Methode, um ein HashSet zu akkumulieren, das die Schnittmenge von Listen darstellt. Die Skip(1)-Methode stellt sicher, dass die erste Liste in listOfLists als Anfangswert für das HashSet verwendet wird.
Lösung 2: HashSet-Iteration
<code class="language-csharp">var intersection = new HashSet<int>(listOfLists.First()); foreach (var list in listOfLists.Skip(1)) { var intersect = new HashSet<int>(intersection); intersection.IntersectWith(list); }</code>
Diese Lösung verwendet ebenfalls ein HashSet, iteriert jedoch über die verbleibenden Listen und erstellt für jede Kreuzung ein neues HashSet.
Leistungsaspekte:
Leistungsbenchmarks zeigen, dass die HashSet-Lösung in den meisten Fällen die Verwendung einer Liste übertrifft. Der Leistungsunterschied zwischen der foreach-Methode und der Aggregate-Methode ist vernachlässigbar.
Das obige ist der detaillierte Inhalt vonWie finde ich den Schnittpunkt mehrerer Listen mit IEnumerable.Intersect()?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!