除了方法返回所有成员而不是仅返回不同的成员

时间:2013-12-01 18:11:11

标签: c# winforms

在下面的代码片段中,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正在初始化。

2 个答案:

答案 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()实现为任何两个对象返回相同的代码。