比较两个集合

leo*_*ora 2 linq collections

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

我想找到LINQ方式来做一个diff,其中包括:

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

LBu*_*kin 10

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

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

var sequenceDiff = sequenceA.Except( sequenceB );
Run Code Online (Sandbox Code Playgroud)

如果要完成两个序列的完全分离,(A-B) union (B-A)则必须使用:

var sequenceDiff = 
         sequenceA.Except( sequenceB ).Union( sequenceB.Except( sequenceA ) );
Run Code Online (Sandbox Code Playgroud)

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

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