C#比较两个列表之间的特定项目属性[重复]

Posted

技术标签:

【中文标题】C#比较两个列表之间的特定项目属性[重复]【英文标题】:C# compare specific item property between two lists [duplicate] 【发布时间】:2019-07-11 04:00:25 【问题描述】:

如果我有两个列表:

List<MyModel> list1;
List<MyModel> list2;

如何创建一个 list3,其中包含 list2 中不存在于 list1 中的所有项目。 我想通过属性字符串 list1.Name 和 list2.Name 比较每个列表中的项目。

请注意,list3 不应包含 list1 中的任何项目。

目的是 list1 是原始列表,我想用 list2 中的项目更新它,方法是将 list3 中的每个项目添加到我的原始 list1 中。我只是不想在更新后出现任何重复。

【问题讨论】:

你试过什么?请显示一些代码 你看到了吗:***.com/questions/3944803/…。看起来正是您所需要的。 如果您的列表属于同一类型。你可以试试var third=list2.Except(list1); 这应该会产生在list2 但不在list1 中的项目。 我尝试了 2 个 if 语句和 2 个 foreach 语句,第一个不起作用,第二个重复了很多。我想我会试试 HimBomBeere 的答案,它看起来像我需要的......谢谢 【参考方案1】:

您的list3 似乎只是一个临时列表,用于存储来自list2 的项目。只需使用这个:

var list3 = list2.Where(x => !list1.Any(y => x.MyProperty == y.MyProperty));

然后将它们添加到list1

list1.AddRange(list3);

不过,您可以通过简单的循环直接更新您的 list1

foreach(var e in list2)

    if(!list1.Any(x => x.MyProperty == e.MyProperty))
        list1.Add(e);

您还可以使用Except,它将对您的项目执行相等性检查。因此,您必须提供IEqualityComparer

var list3 = list2.Except(list1, new MyComparer());

class MyComparer : IEqualityComparer<MyElementType>

    public bool Equals(MyElementType x, MyElementType y)
    
        return x.MyProperty == y.MyProperty;
    
    public int GetHashCode(MyElementType e)
    
        return e.MyProperty.GetHashCode();
    

【讨论】:

我需要它作为一个列表,因此我添加了 .ToList();对于您的第一个建议: var list3 = list2.Where(x => !list1.Any(y => x.MyProperty == y.MyProperty)).ToList();这非常有效。我在第三个列表中需要它的原因是我已经有一个方法可以将列表添加到我的数据库中。非常感谢您的帮助!!

以上是关于C#比较两个列表之间的特定项目属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

删除列表中的重复对象 (C#)

LINQ比较两个列表并将结果放入一个列表[重复]

基于嵌套列表中包含的 id 元素比较两个通用列表的最有效方法 (C#)

C# 比较两个对象的属性值是不是有改变

项目之间具有特定间距的 ListView

C#:组合相同列表的两个元素(不重复)