2017-05-29 7 views

Antwort

2

Mit LINQ-to-Objects Erweiterung Methode Enumerable.Join ist wahrscheinlich die knappste Art und Weise, dies auszudrücken:

List<MyListType> matches = myList 
    .Join(myArray, 
      myListItem => myListItem.someProperty, //if this prop 
      myArrayItem => myArrayItem.someProperty, //and this prop match 
      (myListItem, myArrayItem) => myListItem) //project to... 
    .ToList(); 

Intern diese verwendet eine Hash-Tabelle wie Struktur von links erstellt Handseite des Joins (myList oben), dann iteriert die rechte Seite des Joins (myArray oben) auf der Suche nach Übereinstimmungen in dem Satz von der linken Seite erstellt.

Diese deutlich Verarbeitung beschleunigt im Vergleich zum (naiven) cartesianischen Produkt, das Sie oben beschreiben ("20 * 5 = 100 Vergleiche")

effektiv, tut es so etwas wie diese:

var lookup = lhs.ToLookup(leftItem => leftItem.someProp); 
var matches = rhs.SelectMany(rightItem => 
    lookup[rightItem.someProp] 
     .Select(leftItem => MethodToBeCalledWithTwoMatchingItems(leftItem, rightItem))); 
+0

Dank einer Tonne man..It funktioniert :) –

0

etwas effizienter nur die kleinere Liste Hash, oder derjenige, der weniger ändert:

var hashSet = new HashSet<int> { 1, 2, 3, 4, 5 }; 

var result = list1.Where(item => hashSet.Contains(item.Property)); 
Verwandte Themen