4

タイプのオブジェクトとMyBullList<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か?このメソッドは、2つのオブジェクトの同等性を判断します

OPからのリクエスト

MyBullクラスはIEquatableを実装します

public class MyBull : IEquatable<MyBull>

Equals次に、メソッドをオーバーライドする必要があります

public bool Equals(MyBull theOtherMyBull)

David Nealeが以下で言及するように、これは、同じタイプのオブジェクトを比較する場合に最もよく使用されます。Object.EqualsとObject.GetHashCodeのオーバーライドも機能します。

于 2010-06-02T16:27:58.397 に答える