Was ist der schnellste Weg, um festzustellen, ob eine IEnumerable alle Elemente einer anderen IEnumerable enthält, wenn ein Feld / eine Eigenschaft jedes Elements in beiden Sammlungen verglichen wird?
public class Item
{
public string Value;
public Item(string value)
{
Value = value;
}
}
//example usage
Item[] List1 = {new Item("1"),new Item("a")};
Item[] List2 = {new Item("a"),new Item("b"),new Item("c"),new Item("1")};
bool Contains(IEnumerable<Item> list1, IEnumerable<Item>, list2)
{
var list1Values = list1.Select(item => item.Value);
var list2Values = list2.Select(item => item.Value);
return //are ALL of list1Values in list2Values?
}
Contains(List1,List2) // should return true
Contains(List2,List1) // should return false
c#
.net
linq
ienumerable
Brandon Zacharie
quelle
quelle
Antworten:
Es gibt keinen "schnellen Weg", dies zu tun, es sei denn, Sie verfolgen und pflegen einen Status, der bestimmt, ob alle Werte in einer Sammlung in einer anderen enthalten sind. Wenn Sie nur dagegen arbeiten müssen
IEnumerable<T>
, würde ich verwendenIntersect
.Die Leistung sollte sehr vernünftig sein, da
Intersect()
über jede Liste nur einmal aufgezählt wird. Außerdem ist der zweite Aufruf vonCount()
optimal, wenn der zugrunde liegende Typ einICollection<T>
und nicht nur ein istIEnumerable<T>
.quelle
Sie können auch Außer verwenden, um alle in der zweiten Liste vorhandenen Werte aus der ersten Liste zu entfernen und dann zu überprüfen, ob alle Werte entfernt wurden:
Diese Methode hatte den Vorteil, dass keine zwei Aufrufe von Count () erforderlich waren.
quelle
C # 3.5+
Verwenden Sie,
Enumerable.All<TSource>
um festzustellen, ob alle List2-Elemente in List1 enthalten sind:Dies funktioniert auch, wenn list1 noch mehr als alle Elemente von list2 enthält.
quelle
Contains()
Anrufs innerhalb einesAll()
Anrufs.bool hasAll = list2Uris.All(list1Uris.Contains);
Kents Antwort ist gut und kurz, aber die Lösung, die er bietet, erfordert immer eine Iteration über die gesamte erste Sammlung. Hier ist der Quellcode:
Das ist nicht immer erforderlich. Also, hier ist meine Lösung:
Eigentlich sollten Sie über die Verwendung von
ISet<T>
(HashSet<T>
) nachdenken . Es enthält alle erforderlichen Set-Methoden.IsSubsetOf
in deinem Fall.quelle
Der Linq-Operator SequenceEqual würde ebenfalls funktionieren (ist jedoch empfindlich dafür, dass die Elemente der Aufzählung in derselben Reihenfolge vorliegen).
quelle
Die als Antwort gekennzeichnete Lösung würde bei Wiederholungen fehlschlagen. Wenn Ihre IEnumerable nur unterschiedliche Werte enthält, wird sie übergeben.
Die folgende Antwort gilt für 2 Listen mit Wiederholungen:
quelle
Sie sollten HashSet anstelle von Array verwenden.
Beispiel:
Referenz
Die einzige HasSet-Einschränkung besteht darin, dass wir weder Artikel wie Index noch Artikel wie Schlüssel wie Wörterbücher abrufen können. Alles, was Sie tun können, ist, sie aufzuzählen (für jede, während usw.)
Bitte lassen Sie mich wissen, ob das für Sie funktioniert
quelle
Mit dieser Methode können Sie zwei Listen vergleichen
quelle