linq - 比较两个集合

标签 linq collections

我有一个看似常见的问题/模式。同一对象的两个集合。该对象具有许多属性和其中的一些嵌套对象。 Car 有一个名为 id 的属性,它是唯一标识符。

我想找到 LINQ 方法来做差异,其中包括:

  1. 一个集合中的项目而不是另一个集合中的项目(反之亦然)
  2. 对于匹配的项目,是否有任何变化(变化将是所有属性的比较?(我只关心可设置的属性,我会为此使用反射吗??)

最佳答案

您可以使用 Enumerable.Except()方法。这使用比较器(默认值或您提供的)来评估哪些对象在两个序列中或仅在一个序列中:

var sequenceA = new[] { "a", "e", "i", "o", "u" };
var sequenceB = new[] { "a", "b", "c" };

var sequenceDiff = sequenceA.Except( sequenceB );

如果要对两个序列执行完全析取 (A-B) union (B-A) ,你必须使用:

var sequenceDiff = 
         sequenceA.Except( sequenceB ).Union( sequenceB.Except( sequenceA ) );

如果你有一个复杂的类型,你可以写一个IComparer<T>为您的类型 T 并使用接受比较器的重载。

对于问题的第二部分,您需要滚动自己的实现来报告类型的哪些属性不同。.NET BCL 中没有任何内容。您必须决定此报告将采用何种形式?您将如何识别和表达复杂类型中的差异?你当然可以为此使用反射......但如果你只处理单一类型,我会避免这种情况,并为此编写一个专门的差异实用程序。如果您要支持广泛的类型,那么反射可能更有意义。

关于linq - 比较两个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3407356/

相关文章:

c# - 从 Entity Framework 中获取最大值和最小值,在一个查询中并尽可能进行最佳查询

c# - Linq:如何对关联对象使用规范

Java 8 : Map Lambda expression

multithreading - 使用Groovy的GPar,何时需要使用collectParallel()进行显式同步?

java - 为什么不能扩展集合泛型类型

c# - 像这样制作linq会导致连接池问题吗

sql - 如何获取列表顶部的某些SQL查询结果

c# - 如何在 RavenDB Lucene 查询中包含日期条件

java - 从 Java 8 中的 java.util.stream.Stream 检索列表

magento - 如何在 Magento 中加入集合?