在下面的代码片段中,Except方法只返回列表A的所有成员,而不是A中存在但不存在于B中的成员!
List<Process> ListA = new List<Process>();
List<Process> ListB = new List<Process>();
var ListC = ListA.Except(ListB).ToList();
ListC将获取ListA中存在的所有内容,而不考虑ListB!
这有什么不对?
需要注意的一些信息:ListB是ListA
的副本,此规则ListB
保持不变但ListA
已更新,并且想法是仅获取自那以后运行的那些进程ListB
正在初始化。
答案 0 :(得分:1)
我愿意打赌你没有正确实施Equals
。你能展示你的自定义实现吗?
正如您所看到的,它应该可以正常工作:
void Main()
{
List<int> ListA = new List<int> { 5, 9 };
List<int> ListB = new List<int> {3, 5 };
var ListC = ListA.Except(ListB).ToList();
Console.WriteLine (ListC);
}
输出
9
答案 1 :(得分:1)
Except
使用默认的相等比较器,默认使用Object.Equals()
方法,默认情况下检查引用相等。
你认为两个Process
对象是等价的,即使它们是两个不同的对象(例如两个不同的对象具有相同的Id?)
解决问题的最简单方法是覆盖Object.Equals(object obj)
类中的Process
以使用您拥有的任何等效项。在实现Object.Equals()
时,您还应该实现GetHashCode()
,以便根据Equals()
实现为任何两个对象返回相同的代码。