使用
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();



