2013-07-01 9 views
16

was den besten Weg ist (im Durchschnitt) zwei Listen mit LINQ (Abfragesyntax oder auf andere Weise) vergleichenSuche zwei Listen für mit LINQ mindestens einem Spiel

var A = new [] { 1, 2, 3, ... }; 
var B = new [] { 4, 1, 5, ... }; 

bool match = 
    // Some LINQ expression 

so dass match wahr sein wird, wenn mindestens ein Element in der ersten Liste (in diesem Fall 1) entspricht einem Element aus dem zweiten? Ich muss nicht wissen, wie viele Matches es gab oder welche Matches es gab, nur dass es mindestens ein Match gab.

Antwort

26

Sicher gibt es.

A.Intersect(B).Any(); 

Intersect ist immer nützlich in den am wenigsten zu erwartenden Umständen.

+1

Könnten Sie erweitern Warum ist das richtig und nicht die anderen? –

+2

@EricB Sie sind alle korrekt, in dem Sinne, dass sie Ihnen die gleiche Antwort geben. Dieser ist am effizientesten für große Sets. –

+0

@EricB Richtig, das macht ungefähr dasselbe (99% der Zeit besser) mit kleinen Sätzen und besser noch mit großen Sätzen. –

6

Sie könnten Intersect verwenden, aber das würde alle Übereinstimmungen berechnen, die Sie nicht benötigen. So Any ist besser, da es Kurzschluss:

bool match = A.Any(a => B.Any(b => b == a)); 
+0

Guter Punkt. Ich hätte nie gedacht, dass "Intersect" vollständig funktioniert, bevor es nachgibt. Es macht Sinn. –

+3

@SimonBelanger Richtig, aber im schlimmsten Fall ist das "O (mn)". Sicher, der beste Fall ist "O (m)", aber die besten Fälle sind nicht üblich. 'Schnitt ', otoh, ist immer' O (m + n)'. –

+0

@newStackExchangeInstance Es kommt dann wirklich auf die spezifischen Fälle an. Vielen Dank für die Informationen, immer neugierig auf die Komplexität der verschiedenen LINQ-Operatoren. –

2

Sie sind für eine Kombination aus Intersect suchen und Any

bool match = A.Intersect(B).Any(); 
3

Sie auch

können
A.Any(x => B.Contains(x)) 
+1

Nun, ja ... aber das ist (worst case) 'O (mn)', während 'Intersect' ist 'O (m + n) '(zu allen Zeiten) –

+0

nie wirklich darüber nachgedacht –