2012-09-25 7 views
27

Ich frage mich, ob Linq eine Methode hat, um zu überprüfen, ob zwei Sammlungen mindestens ein einzelnes Element gemeinsam haben. Ich würde so etwas erwarten:Suchen Sie nach einem Element in zwei Sammlungen

var listA = new List<int>() { some numbers }; 
var listB = new List<int>() { some numbers, potentially also in list A }; 

bool hasSameElements = listA.hasMatchingElements(listB); 

Gibt es es in Linq oder sollte ich eine benutzerdefinierte Methode dafür schreiben?

Ich kenne die Intersect-Methode, aber ergibt dies nicht die gesamte Schnittmenge? Ich bin nur daran interessiert, zu überprüfen, ob sich die beiden Kollektionen überschneiden, was dazu führt, dass das gesamte Set wie eine Verschwendung erscheint, besonders bei größeren Sammlungen.

+0

'Intersect' liefert nur so viele Elemente wie gewünscht. Wenn Sie es mit 'Any' oder' FirstOrDefault' verfolgen, oder eine 'foreach' machen und die erste Iteration unterbrechen, wird nur das _first_ Element gefunden, das in beiden Listen existiert (falls vorhanden) - es wird nicht stören finde den Rest. – Rawling

+1

Beachten Sie jedoch, dass die 'Intersect'-Operation _eine_ der beiden Sequenzen _completely_ read erfordert, bevor das erste Element ausgegeben werden kann. Wenn einer Ihrer Eingänge unendlich ist, stellen Sie sicher, dass nicht der Eingang vollständig verbraucht wird. Beachten Sie, dass [die Spezifikation] (http://msdn.microsoft.com/en-us/library/bb460136.aspx) für 'Intersect' _lies_ darüber, wie es funktioniert. – Rawling

Antwort

58

Klingt wie Sie wollen einfach nur:

bool hasSameElements = listA.Intersect(listB).Any(); 

EDIT: Wie in den Kommentaren erwähnt, Intersect faul Auswertung verwendet. Es verschiebt alle Ausführung, bis das erste Element aus dem Ergebnis gelesen wird; An diesem Punkt wird von listB in ein Set geladen und dann listA streamen, bis ein Ergebnis gefunden wird. An diesem Punkt wird Any()true zurückgeben und so wird keine Arbeit mehr getan werden. Siehe meine Edulinq post on Intersect für weitere Informationen.

+0

Liefert das nicht zuerst den gesamten Schnittmengensatz? – zeebonk

+0

Verwenden Sie dann FirstOrDefault()? –

+0

@Lews - nicht viel Hilfe mit 'int's, was ist, wenn beide Listen eine' 0' enthalten? – Rawling

Verwandte Themen