2017-05-29 77 views

回答

2

使用LINQ到對象擴展方法Enumerable.Join可能是表達這種最簡潔的方式:

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(); 

在內部,這個使用了哈希表狀結構從左邊創建(上面的myList),然後遍歷連接的右側(上面的myArray),查找從左側創建的集合中的匹配項。

相比您在上面描述(「20×5 = 100個比較」

有效的(幼稚)笛卡爾積時,這顯著加快處理速度,但它確實是這樣的:

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

由於一噸man..It工程:) –

0

多一點有效的哈希只是較小的列表,或改變少一個:

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

var result = list1.Where(item => hashSet.Contains(item.Property)); 
相關問題