2016-04-29 11 views
3

Ich habe zwei IEnumerable Objekte und ich möchte validieren, wenn einer von ihnen alle Elemente des anderen enthält.IEnumerable enthält IEnumerable

Ich benutze aber die Kreuzung funktioniert nicht so, wie ich es erwarten würde. Er gibt true zurück, sogar nur eines der Elemente in obj2 existiert in obj1.

Gibt es eine Möglichkeit zu überprüfen, ob alle Elemente von obj2 in obj1 existieren?

+2

Verwenden 'All' statt' Intersect.Any' – zerkms

+0

Wenn Sie sie in der gleichen Reihenfolge möchten, können Sie 'SequenceEqual' verwenden. Andernfalls könnten Sie überprüfen, ob die Schnittmenge die gleiche Länge wie die Untersequenz hat. – Blorgbeard

+0

@zerkms 'All()' wird nicht funktionieren. Alles, was? 'Any()' bedeutet, dass irgendwelche Elemente existieren, 'All()' ist bedeutungslos ohne Lambda. – Blorgbeard

Antwort

7

Es gibt keine einzelne LINQ-Methode, die das tut, was Sie brauchen, ohne wenigstens ein Lambda anzugeben. Es gibt jedoch mehrere Möglichkeiten, dies mit LINQ zu tun. Hier sind ein paar Optionen (zu testen, ob obj2 ist eine Teilmenge von obj1):

obj1.Intersect(obj2).Count() == obj2.Count() 

oder

obj2.All(x=>obj1.Contains(x)) 

oder

obj2.Except(obj1).Any() 
+4

Der erste gibt möglicherweise falsche positive Ergebnisse zurück, wenn "obj2" Duplikate enthält. – zerkms

+0

Erste Option funktioniert! @zerkms du hast Recht ... ich werde sicherstellen, dass keine Duplikate existieren. – Snapper

+0

Was ist mit '.Except()'? Sollte tun, was op erwartet (3. Beispiel von Steven) – Mafii