4

如果我有一个类型的对象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); 
4

4 回答 4

23

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

于 2010-06-02T16:27:02.610 回答
8

如果您可以使用 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!");
于 2010-06-02T16:46:58.553 回答
4

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

为了解决这个问题,您必须重写 Equals 和 GetHashCode 方法(这意味着您可能也应该实现IEquatable<MyBull>和重写 == 和 != 运算符)。

于 2010-06-02T16:29:26.360 回答
3

您的 MyBull 对象是否实现IEquatable<T>.Equals?此方法将确定两个对象的相等性

由 OP 要求

您的 MyBull 类将实现 IEquatable

public class MyBull : IEquatable<MyBull>

然后你需要重写该Equals方法

public bool Equals(MyBull theOtherMyBull)

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

于 2010-06-02T16:27:58.397 回答