【发布时间】:2015-08-07 12:44:46
【问题描述】:
我有一个示例类
public class Item
{
public int Id;
public string Name;
public int ItemParentId;
}
然后我将许多 Items 放入数据库,它们有一个 Id、Name 和 ItemParentId,但我还创建了一个新 Items 列表,它们有 Name、ItemParentId,但 Id = 0;
我确实选择了数据库中的所有项目到 list1。我用新的项目创建了新的 list2。
我想做这样的事情:
list1.Union(list2); // need to combine only with different ItemParentId
但问题是我只需要组合那些 ItemParentId 不相等的项目。 Linq Union 只让创建 IEqualityComparer,但是这个不适合。我也试过 IComparer,但 Union 不允许使用它。任何帮助将不胜感激。
列表示例和我想要的结果:
var list1 = {
Item { Id = 1, Name = "item1", ItemParentId = 100 },
Item { Id = 2, Name = "item2", ItemParentId = 200 },
Item { Id = 3, Name = "item3", ItemParentId = 300 },
Item { Id = 4, Name = "item4", ItemParentId = 400 }
}
var list2 = new List<Item>{
new Item { Id = 0, Name = "item5", ItemParentId = 500 },
new Item { Id = 0, Name = "item6", ItemParentId = 300 },
new Item { Id = 0, Name = "item7", ItemParentId = 400 },
}
结果列表应包含 3 个项目,名称分别为“item1”、“item2”、“item3”、“item4”和“item5”
更新:
谢谢大家,在你们的帮助下,我设法按单个属性比较项目,但现在我必须通过其中两个来比较。其实我的小姐姐现在有10个属性,但我只需要比较两个,比较器看起来不错,我只想知道HashCode是做什么用的?
【问题讨论】:
-
为什么 IEqualityComparer “不适合”?
-
因为它比较两个对象,但我只需要比较对象参数,list1和list2之间的Id永远不会相等
-
@GrandaS 你可以写一个
IEqualityComparer来做任何你想做的事情,包括比较ItemParentId。但请注意,Union仍会返回其中一个重复项。 -
它以编码方式比较两个对象以比较它们,您需要根据 ItemParentId 比较两个 Item 对象,因此创建一个相等比较器来执行此操作。
-
@GrandaS 嗯。为什么结果不应该包含“item3”?似乎应该这样做。