2

我有一个对象类型的 2 个列表:

列表<MyClass> list1;
列表<MyClass> list2;

提取这两个列表之间数据差异的最佳方法(性能和干净的代码)是什么?
我的意思是获取添加、删除或更改(以及更改)的对象?

4

5 回答 5

13

尝试Except使用Union,但您需要为两者都这样做才能找到两者的差异。

var exceptions = list1.Except(list2).Union(list2.Except(list1)).ToList();

或者作为 Linq 的替代方案,可能会有更快的方法:HashSet.SymmetricExceptWith():

var exceptions = new HashSet(list1);

exceptions.SymmetricExceptWith(list2);
于 2012-05-01T15:01:39.907 回答
2
IEnumerable<string> differenceQuery = list1.Except(list2);

http://msdn.microsoft.com/en-us/library/bb397894.aspx

于 2012-05-01T15:05:02.327 回答
0

您可以使用FindAll来获得您想要的结果,即使您IEquatable的. 这是一个例子:IComparableMyClass

List<MyClass> interetedList = list1.FindAll(delegate(MyClass item1) {
   MyClass found = list2.Find(delegate(MyClass item2) {
     return item2.propertyA == item1.propertyA ...;
   }
   return found != null;
});

list2同样,您可以通过比较来获取您感兴趣的项目list1

此策略也可能会获得您的“更改”项目。

于 2012-05-01T15:23:54.050 回答
0

获取在 list1 或 list2 中但不在两者中的项目的一种方法是:

var common = list1.Intersect(list2);
var exceptions = list1.Except(common).Concat(list2.Except(common));
于 2015-07-31T11:03:50.847 回答
0

试试这个进行对象比较并循环它List<T>

public static void GetPropertyChanges<T>(this T oldObj, T newObj)
{
    Type type = typeof(T);
    foreach (System.Reflection.PropertyInfo pi in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
    {
        object selfValue = type.GetProperty(pi.Name).GetValue(oldObj, null);
        object toValue = type.GetProperty(pi.Name).GetValue(newObj, null);
        if (selfValue != null && toValue != null)
        {
            if (selfValue.ToString() != toValue.ToString())
            {
             //do your code
            }
        }
    }
}
于 2016-01-18T10:12:49.080 回答