2010-05-08 42 views
0

給出一個列表...看看項目的可枚舉(LINQ)曾經存在

class Item 
{ 
public Name 
{ 
    get; 
    set; 
} 
} 

List<Item> items = new List<Item> 
{ 
new Item() { Name = "Item 1" }, 
new Item() { Name = "Item 1" }, 
new Item() { Name = "Item 2" }, 
new Item() { Name = "Item 3" } 
} 

List<Item> listing = new List<Item> 
{ 
new Item() { Name = "Item 1" }, 
new Item() { Name = "Item 2" }, 
new Item() { Name = "Item 3" } 
new Item() { Name = "Item 4" } 
} 

我需要創建第三個數組,將抵消這兩者之間的雙實例;不過,具有「名稱1」的項目都是相同的,但不同的「實例」。所以第三個List應該有1個Item 1的實例,因爲'Items'有2個實例。關於如何通過Linq完成的任何想法?

+0

你能準確地包括你期望你的輸出列表是什麼嗎? – tzaman 2010-05-08 00:33:31

回答

3

首先,您需要爲Item創建一個EqualityComparer

public sealed class ItemEqualityComparer : EqualityComparer<Item> 
{ 
    public override bool Equals(Item x, Item y) 
    { 
     return x.Name.CompareTo(y.Name) == 0; 
    } 

    public override int GetHashCode(Item obj) 
    { 
     return obj.Name.GetHashCode(); 
    } 
} 

然後你需要撥打的是Union

var itemUnion = items.Union(listing, new ItemEqualityComparer()); 
+0

我不確定,但我認爲OP想要的東西更像是一個集合差異('Except')而不是'Union'。 – tzaman 2010-05-08 00:34:57

+0

這不是我遇到的具體問題,但它非常有用,解決了問題的另一部分。我打開了另一個更具體的問題,我將在這一篇中編輯我的措辭以與答案相關;因爲它仍然有用。 – Ciel 2010-05-08 02:11:34