【问题标题】:Except method returns all the members instead of returning only the different onesexcept 方法返回所有成员,而不是只返回不同的成员
【发布时间】:2013-12-02 02:14:20
【问题描述】:

在下面的 sn-p 代码中,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 被初始化以来运行的那些进程.

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    Except 使用默认相等比较器,默认情况下使用Object.Equals() 方法,默认情况下检查引用相等。

    您是否认为两个 Process 对象是等效的,即使它们是两个不同的对象(例如,两个不同的对象具有相同的 Id?)

    解决它的最简单方法是在 Process 类中覆盖 Object.Equals(object obj) 以使用您拥有的任何等价物。在实现Object.Equals() 时,您还应该实现GetHashCode(),以便它为任何两个根据Equals() 实现等效的对象返回相同的代码。

    【讨论】:

    • 我应该使用扩展方法来覆盖equals吗?因为我没有这门课?我只是在一个方法中使用它来获取新进程。
    • 不,您不能使用扩展方法。如果您无法修改 Process 类,您可以使用 Except() 的重载,它将自定义比较器作为参数。
    • 非常感谢 ;) 所以第一种方法是从进程类继承并覆盖它的 Equals 和 GetHashCode 方法并使用我继承的类:) 如果我不想麻烦,我可以使用后来的方法:)再次感谢:)
    • 从这样的类继承看起来比构建一个简单的比较器要麻烦得多。
    • @AndersAbel:我试过这个:pastebin.com/0s84hKdc 但它仍然不起作用,我错过了什么或做错了什么?
    【解决方案2】:

    我敢打赌你没有正确实施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

    【讨论】:

      猜你喜欢
      • 2020-09-30
      • 2021-02-15
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多