【问题标题】:Comparing two lists with LINQ, and retrieve the different items用 LINQ 比较两个列表,并检索不同的项目
【发布时间】:2016-01-27 17:19:54
【问题描述】:

假设我有以下对象foo 及其属性如下:

class foo
public string name
public string property1
public string property2

现在让我们实例化两个foo列表:List<foo>()

第一个列表包含两个 foo 对象:

new foo() = 
{
   name = "name",
   property1 = "random value",
   property1 = "random value"
}

new foo() = 
{
   name = "name",
   property1 = "random value",
   property1 = "random value"
}

第二个列表包含一个foo对象:

new foo() = 
{
   name = "name",
   property1 = "random value",
   property1 = "random value"
}

是否可以使用 LINQ 比较并返回一个新的List<foo>,其中包含这两个列表(或任何其他列表)之间的差异? 考虑到项目顺序和任何不匹配的属性值也被视为差异。

这对原始对象很有帮助: Compare two lists, item by item, using linq 但不提供返回包含差异的新列表的方法。

编辑

@CSharpie 重新打开...现在问题看起来定义很不明确 - 即 {1,2,3,4} 和 {1,3,4} 的预期结果是什么?可能 OP 正在寻找某种差异。

@AlexeiLevenkov 输出应该是 2。或者对于 {1,2,3,4} 和 {1,3,2, 4} 的列表,输出应该是 {3,2},因为顺序(或值) 的 3 和 2 已从原始列表更改。

【问题讨论】:

  • @CSharpie 重新打开......现在问题看起来定义很不明确 - 即 {1,2,3,4} 和 {1,3,4} 的预期结果是什么?可能 OP 正在寻找某种差异..
  • @Alexei Levenkov,你是对的。 OP:您需要澄清您认为两个列表之间的区别以及这些列表中项目的顺序所起的作用。最好是指定一些具有预期结果的示例。
  • 对不起,我的坏人,稍后会更新问题。
  • @CSharpie 请查看我的编辑。如果不清楚,请告诉我。

标签: c# linq list


【解决方案1】:

尝试使用Except LINQ 方法:

List<int> a = new List<int>{ 1, 2, 5 };
List<int> b = new List<int>{ 2, 3};
var result = a.Except(b).Union(b.Except(a)).ToList();

在集合论中,(A-B)+(B-A) 等价于两者的区别。

【讨论】:

  • 这适用于复杂对象吗?比如上面描述的foo
  • 当然,您只需要编写自己的 Comparor 即可。这是一个提示,您需要从这里尝试一下
  • 另一个提示是,查看 MoreLinq 或 ExtraLinq,它们可能有一个新的扩展来满足您的需要。但即使他们这样做了,您仍然需要编写一个比较器来确定为什么 2 个对象相等
  • 这个方法如何区分顺序?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多