2010-05-08 47 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