我有一个对象类型的2个列表:
List<MyClass> list1;
List<MyClass> list2;
答案 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);
答案 2 :(得分:0)
即使您的FindAll
未实施IEquatable
或IComparable
,您也可以使用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
}
}
}
}