2012-09-25 13 views
27

Me pregunto si Linq tiene un método para verificar si dos colecciones tienen al menos un elemento en común. Esperaría algo como esto:Buscar cualquier elemento que exista en dos colecciones

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

bool hasSameElements = listA.hasMatchingElements(listB); 

¿Existe en Linq o debería escribir un método personalizado para ello?

Conozco el método de Intersección, pero ¿esto no produce todo el conjunto de intersección? Solo me interesa comprobar si las dos colecciones se cruzan, lo que da como resultado que todo el conjunto sea un desperdicio, especialmente en colecciones más grandes.

+0

'Intersecar' solo produce tantos elementos como se solicite. Si lo sigue con 'Any', o' FirstOrDefault', o hace un 'foreach' y rompe con la primera iteración, solo encontrará el _primero_ elemento que existe en ambas listas (si corresponde) - no le molestará encuentra el resto – Rawling

+1

Sin embargo, tenga en cuenta que la operación 'Intersecar' requiere _una_ de las dos secuencias para _completamente_ leer antes de que el primer elemento pueda ser cedido. Si una de tus entradas es infinita, asegúrate de que no sea la entrada la que se consuma por completo. Tenga en cuenta que [la especificación] (http://msdn.microsoft.com/en-us/library/bb460136.aspx) para 'Intersect' _lies_ sobre cómo funciona. – Rawling

Respuesta

58

Suena como lo que desea:

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

EDIT: Como se señaló en los comentarios, Intersect utiliza la evaluación perezosa. Extiende ejecución todo hasta que se lea el primer elemento del resultado; en ese punto cargará todos de listB en un conjunto, y luego transmitirá listA hasta que encuentre un resultado para ceder. En ese punto, Any() devolverá true, por lo que no se realizará más trabajo. Vea mi Edulinq post on Intersect para más información.

+0

¿No da esto primero el conjunto de intersección completo? – zeebonk

+0

Entonces, use FirstOrDefault()? –

+0

@Lews: no es de mucha ayuda con 'int's, ¿y si ambas listas contienen un' 0'? – Rawling

Cuestiones relacionadas