我有一个看似常见的问题/模式.同一个对象的两个集合.该对象具有许多属性和一些嵌套对象.Car有一个名为id的属性,它是唯一的标识符.
我想找到LINQ方式来做一个diff,其中包括:
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范围的类型,那么反思可能更有意义.