【问题标题】:List.Contains is not working as hopedList.Contains 没有按预期工作
【发布时间】:2010-06-02 16:23:42
【问题描述】:

如果我有一个MyBull 类型的对象和一个List<MyBull> orig

// Just an example
MyBull x = getMeTheObjectWithIdFromDB(9);

orig.add(x);

// Again same? data object
MyBull y = getMeTheObjectWithIdFromDB(9);

那为什么是假的呢?

// This is false, even though all the properties
// of x and y are the same.
orig.Contains<MyBull>(y); 

【问题讨论】:

    标签: c# list iequalitycomparer


    【解决方案1】:

    默认情况下,对象将公开基于引用的相等性。如果您想要自定义规则,例如基于 id 字段的相等性,则需要覆盖 EqualsGetHashCode 方法。

    【讨论】:

    • 这个答案在我的“answer-a-C#-question-by-giving-a-Java-answer”游戏中又给了我一分! :) 虽然我没有太多的 C# 经验,但内心的 Java 开发人员立即脱口而出“他忘了实现equals()hashCode()!” ;)
    【解决方案2】:

    如果你可以使用 LINQ,那么你可以

    class Vessel
    {
        public int id { get; set; }
        public string name { get; set; }
    }
    

    ...

    var vessels = new List<Vessel>() { new Vessel() { id = 4711, name = "Millennium Falcon" } };
    
    var ship = new Vessel { id = 4711, name = "Millencolin" };
    
    if (vessels.Any(vessel => vessel.id == ship.id))
        Console.Write("There can be only one!");
    

    【讨论】:

      【解决方案3】:

      这是因为 MyBull 实例是通过引用进行比较的。从 .NET 的角度来看,x 和 y 都是 不同的实例,因此不相等。

      为了解决这个问题,您必须使用 override the Equals and GetHashCode methods(这意味着您可能应该实现 IEquatable&lt;MyBull&gt; 并覆盖 == 和 != 运算符)。

      【讨论】:

        【解决方案4】:

        您的 MyBull 对象是否实现了IEquatable&lt;T&gt;.Equals?这个方法会判断两个对象是否相等

        OP 要求

        您的 MyBull 类将实现 IEquatable

        public class MyBull : IEquatable<MyBull>
        

        然后你需要重写 Equals 方法

        public bool Equals(MyBull theOtherMyBull)
        

        正如大卫尼尔在下面提到的,当您比较相同类型的对象时最好使用此方法 - 您就是这样。覆盖 Object.Equals 和 Object.GetHashCode 也可以。

        【讨论】:

        • 来自 MSDN (IEquatable.Equals 方法) - 指示当前对象是否等于另一个相同类型的对象。 msdn.microsoft.com/en-us/library/ms131190.aspx
        • 这似乎是所要求的——使用通用 List。 @David Neale:抱歉,误读了您的评论。这只是对我关于“两个对象相等”的评论的澄清
        猜你喜欢
        • 2021-10-19
        • 2020-03-18
        • 2012-06-14
        • 2014-11-15
        • 1970-01-01
        • 2012-07-02
        • 2011-09-07
        • 2013-03-03
        • 2015-05-18
        相关资源
        最近更新 更多