我有两个用CustomsObjects填充的通用列表。
我需要在第三个列表中检索这两个列表(第一个列表中的项目,第二个列表中的项目)之间的差异。
我本以为使用.Except()
是个好主意,但看不到如何使用。
使用Except
是完全正确的方法。如果您的类型覆盖Equals
和GetHashCode
,或者您只对引用类型相等感兴趣(即,如果两个引用引用完全相同的对象,则两个引用仅是“相等”),您可以使用:
var list3 = list1.Except(list2).ToList();
如果您需要表达自定义的相等性想法(例如,通过ID),则需要实现IEqualityComparer<T>
。例如:
public class IdComparer : IEqualityComparer<CustomObject>
{
public int GetHashCode(CustomObject co)
{
if (co == null)
{
return 0;
}
return co.Id.GetHashCode();
}
public bool Equals(CustomObject x1, CustomObject x2)
{
if (object.ReferenceEquals(x1, x2))
{
return true;
}
if (object.ReferenceEquals(x1, null) ||
object.ReferenceEquals(x2, null))
{
return false;
}
return x1.Id == x2.Id;
}
}
然后使用:
var list3 = list1.Except(list2, new IdComparer()).ToList();
请注意,这将删除所有重复的元素。如果您需要保留重复项,则可能最简单的方法是从中创建集合list2
并使用类似方法:
var list3 = list1.Where(x => !set2.Contains(x)).ToList();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句