2013-01-10 56 views

回答

2

因此,第一種情況是你的基本Join操作,這Linq的支持:

var matchingItems = from item1 in list1 
      join item2 in list2 
      on new{ item1.id, item1.CategoryId} 
      equals new{ item2.id, item2.CategoryId} 
      select new { item1, item2 }; 

對於第二種情況:

var idValues = list2.Select(item => new { item.id, item.CategoryId }) 
    .ToHashSet(); 
var missingItems = list1.Where(item => !idValues.Contains(new { item.id, item.CategoryId })); 

這裏是ToHashSet定義:

public static class Extensions 
{ 
    public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source) 
    { 
     return new HashSet<T>(source); 
    } 
} 
+0

這裏的問題變成了多少行你能寫出來做同樣簡單的事嗎 –

+0

我看不出你的意思。你是說你可以用較少的代碼做同樣的事情嗎?如果是這樣,通過一切手段證明。目前,您的第一個答案是不完整的,如果您完成了第一個答案,則會比這更長,而第二個答案不起作用,因此比較它們是無效的。 – Servy

+0

您的回答將會是我所尋找的,因爲我所提及的這些列表在這種特殊情況下並不是相同的類型,但是在您的最後一個示例中,我列出了只存在於兩個表上的項目列表。基於這個返回的列表我可以實現一個過濾器來獲取List2上缺少的項目的返回列表? – Lothre1

3

您可以實現一個簡單的IComparer爲您的數據類型和使用

var intersection = List1.Intersect(List2, myCategoryIdComparer); 

var notRepeating = List1.Union(List2).Except(intersection); 

var notInList1 = List2.Except(List1, myCategoryIdComparer); 

您可以實現IComparer容易:

public class CategoryComparer : IComparer { 
      int IComparerList1.CompareIntersect(Object x, Object y) { 
      // do some type checks to make sure both are CategoryObject 
      return ((CategoryObject)x).CategoryID 
       .Compare(((CategoryObject)y).CategoryIdmyCategoryIdComparer); 
     } 
    } 
+0

Tha t將無法處理第二種情況 – Servy

+0

您在第二種情況下的嘗試不正確。你需要得到一對項目,這樣你的每對貨幣都沒有相同的ID值。這是用'SelectMany'完成的(在第一個查詢選對之前,你也不能用'Except'來修飾它)。 – Servy

+0

哦,現在還不清楚它是否適用,但只有兩個列表屬於同一類型,即使使用自定義比較器,「Intersect」也適用。您不能使用它來加入兩個具有不同編譯時類型的列表。 – Servy

2

你也可以使用一個join條款,雖然它會要求你初始化了一些匿名類型。

var result = (from l1 in list1 
       join l2 in list2 on new {l1.Id, l1.Category} 
       equals new {l2.Id, l2.Category} 
       select l1).ToArray(); 
+0

這將無法處理第二種情況 – Servy

+0

完全不可讀 –

相關問題