首页 > 解决方案 > 比较 2 列表 - LINQ

问题描述

有 2 个大型对象列表,我需要在其中执行 where 子句并找到匹配的记录。

List<A> a= ...;
List<A> b = ...;

一个模型

ID

姓名

年龄

地址

与List比较后,我需要返回一个包含List所有对象的列表。

我应该检查的属性是:如果Ids相等,如果Names相等,如果ages相等。

List<A> common = a.Where(n => b.Select(o => o.Id).Contains(n.Id))
     .Where(n => b.Select(o => o.Name).Contains(n.Name))
     .Where(n => b.Select(o => o.Age).Contains(n.Age))

这应该有问题,因为它返回一个Null.

标签: c#linq

解决方案


您可以创建自定义EqualityComparer

public class ModelEqualityComparer : IEqualityComparer<Model>
{
    public bool Equals(Model x, Model y)
    {
        return x.Id == y.Id && x.Name == y.Name && x.Age == y.Age;
    }

    ...
}

并像这样使用它:

var intersect = a.Intersect(b, new ModelEqualityComparer());

如果您只想要 LINQ 解决方案:

List<Model> common = a
   .Where(q => b.Any(w => w.Id == q.Id && w.Name == q.Name && q.Age == w.Age))

推荐阅读