【问题标题】:Looking for an elegant way to compare two lists and show differences from either side寻找一种优雅的方式来比较两个列表并显示两边的差异
【发布时间】:2017-05-11 07:24:44
【问题描述】:

假设我有两个字符串列表。

List 1
- Item Abc
- Item Xyz
- Item BlahBlah

List 2
- Item Abc
- Item Xyz
- Item YadiYada

我想显示匹配和缺失匹配的表格,如下所示:

List 1          |   List 2
----------------------------------
Item Abc        |   Item Abc
Item Xyz        |   Item Xyz
Item BlahBlah   |
                |   Item YadiYada

我认为这可以用 LINQ 优雅地完成,但我不太确定如何解决它。我很感激这方面的一些指导。

【问题讨论】:

  • 提供一个minimal reproducible example,说明您到目前为止所尝试的方法,以便在需要时提供帮助。
  • 集合论呢? union 他们然后.except() 通过他们的intersect?而intersect 会给你匹配,这种方法会给你所有不匹配。 -- ((List A) U (List B)) - ((List A) ∩ (List B))
  • @BagusTesa,我知道你要去哪里,但这只会给我收集其他列表中不包含的那些,这只是答案的一部分。我还需要那些仅在 List1 中的项目和仅在 List2 中的项目。不过,这帮助我走上了正轨!
  • 项目的顺序是否重要或容易被捏造,例如1、2、3 是否等于 2、1、3,因为它包含所有相同的值?您使用的是List<string> 还是其他一些对象集合?如果不是字符串,你想比较对象引用还是做深度比较,即具有相同属性值的不同对象匹配?
  • @HABO,不,顺序不重要。更多的问题是,列表 1 中的项目是否包含在列表 2 中,反之亦然。如果没有,哪些是缺失的,以及来自哪个列表。至于我正在使用哪种类型的列表,它实际上是一侧的对象列表,其中一个对象属性与另一个字符串列表进行比较。我在这里简化了问题,因为我的问题的核心是如何比较它们。

标签: c# linq outer-join


【解决方案1】:

只是另一种解决方案:

var list1 = new List<string> { "Abc", "Xyz", "BlahBlah" };
var list2 = new List<string> { "Abc", "Xyz", "YadiYada" };

var r1 = from l1 in list1
         join l2 in list2 on l1 equals l2 into t
         from l2 in t.DefaultIfEmpty()
         select new { l1, l2 };

var r2 = from l2 in list2
         join l1 in list1 on l2 equals l1 into t
         from l1 in t.DefaultIfEmpty()
         select new { l1, l2 };

var result = r1.Union(r2);

Left Outer Join

这是使用方法语法的替代方法:

var list1 = new List<string> { "Abc", "Xyz", "BlahBlah" };
var list2 = new List<string> { "Abc", "Xyz", "YadiYada" };

var r1 = list1
    .GroupJoin(
        list2,
        l1 => l1,
        l2 => l2,
        (l1, l2) => new { l1 = l1, l2 = l2.FirstOrDefault() });

var r2 = list2
    .GroupJoin(
        list1,
        l2 => l2,
        l1 => l1,
        (l2, l1) => new { l1 = l1.FirstOrDefault(), l2 = l2 });

var result = r1.Union(r2);

LINQ Query Syntax versus Method Syntax

一般来说,我们推荐使用查询语法,因为它通常更简单 并且更具可读性;但是两者之间没有语义差异 方法语法和查询语法。此外,一些查询,如 检索与指定元素匹配的元素数量的那些 条件,或检索具有最大值的元素 源序列,只能表示为方法调用。

【讨论】:

  • 您将如何使用 LINQ 扩展语法(使用 lambda 表达式)编写此代码?
【解决方案2】:

试试这个:

var leftList = new List<string>() { "1", "2", "3" };
var rightList = new List<string>() { "2", "3", "4" };

var left = leftList.Except(rightList).Select(e => new { L = e, R = string.Empty });
var right = rightList.Except(leftList).Select(e => new { L = string.Empty, R = e });
var intersection = leftList.Intersect(rightList).Select(e => new {L = e, R = e});

var result = intersection.Union(left).Union(right).ToList();

【讨论】:

  • 啊,我明白了。很有意义。我会尽量适应我的场景。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2015-08-10
  • 2017-05-10
相关资源
最近更新 更多