获得两个列表之间的差异

时间:2012-05-01 14:57:11

标签: c# .net object

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

List<MyClass> list1;
List<MyClass> list2;

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

5 个答案:

答案 0 :(得分:13)

使用Except尝试Union,但您需要为两者执行此操作才能找到两者的差异。

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

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

var exceptions = new HashSet(list1);

exceptions.SymmetricExceptWith(list2);

答案 1 :(得分:2)

IEnumerable<string> differenceQuery = list1.Except(list2);

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

答案 2 :(得分:0)

即使您的FindAll未实施IEquatableIComparable,您也可以使用MyClass来获得所需的结果。这是一个例子:

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获取您感兴趣的项目。

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

答案 3 :(得分:0)

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

var common = list1.Intersect(list2);
var exceptions = list1.Except(common).Concat(list2.Except(common));

答案 4 :(得分: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
            }
        }
    }
}