【问题标题】:Compare 2 List - LINQ [duplicate]比较 2 列表 - LINQ [重复]
【发布时间】:2019-09-14 09:05:17
【问题描述】:

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

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

模型

身份证

名字

年龄

地址

与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

【问题讨论】:

  • 如果你只想要比较后的匹配项,你应该使用IntersectLINQ方法。您还想只比较对象的少数属性,因此您应该编写和实现 IComparer 接口并在 Intersect 方法中使用它。 stackoverflow.com/questions/4340273/…
  • 你没有尝试加入吗??
  • @UdaraKasun 我有多个条件可以加入工作吗?新手。

标签: c# linq


【解决方案1】:

您可以创建自定义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))

【讨论】:

  • 有没有办法在没有客户类的情况下做到这一点?
  • 所以当你使用 Any 时,它会将ab 进行比较,并给出aonly 的共同点吗?希望我说清楚了;)。另外,我有大约 800K+ 记录,我尝试了你的方法,这需要很多时间。好像5分钟。那么我们可以优化这段代码吗?
猜你喜欢
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多