【问题标题】:Using linq to retrieve differences between two lists with duplicates [duplicate]使用 linq 检索具有重复项的两个列表之间的差异 [重复]
【发布时间】:2014-04-16 21:48:54
【问题描述】:

我有两个列表,其中仅包含我从不同来源获得的重复项。

//Duplicate 1
var Duplicate1 = list1.GroupBy(d => new { d.Name, d.Value })
    .Where(dup => dup.Count() > 1).SelectMany(dup => dup);

这会返回:{{red, red}, {red, red}, {green, green}, {green, green}}

//Duplicate 2
var Duplicate2 = list2.GroupBy(d => new { d.Name, d.Value })
    .Where(dup => dup.Count() > 1).SelectMany(dup => dup);

这会返回:{{red, red}, {red, red}, {green, green}, {green, green}, {green, green}}

如何使用 linq 对这些列表进行排序,以便我所拥有的只是 {green, green} 的差异?

【问题讨论】:

  • 不确定建议的链接是否适用,看起来您可能有多个具有相同值的重复项,如果您需要所有这些重复项都能够计算它们,那么 Intersect 将无济于事(平等会折叠那些重复)。在这种情况下你需要什么?

标签: c# linq


【解决方案1】:

创建两个lookup,然后加入这些lookup,检查哪个lookup pair的item最多,然后取等于差值的item个数:

var al = Duplicate1.ToLookup(x => x);
var bl = Duplicate2.ToLookup(x => x);

var result = al.Join(bl,  agrp        => agrp.Key, 
                                bgrp  => bgrp.Key,
                         (agrp, bgrp) => agrp.Count() > bgrp.Count() ?
                                         agrp.Take(agrp.Count() - bgrp.Count()) :
                                         bgrp.Take(bgrp.Count() - agrp.Count()))
                .SelectMany(x => x);

【讨论】:

  • 这是我采用的解决方案,但我也弄清楚了我的路线问题是什么,这些比较是在假设一切都完全相同的情况下进行的,问题是由存储的列表引起的在两个不同的内存位置,所以我必须覆盖对象的 equals 和 GetHashCode,以便它指的是相同的名称和值,而不是内存中的位置。
  • @RichardMc 这正是我在对该问题的评论中所指的那种问题。根据您处理的对象类型,平等可能会很棘手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多