質問

タイプのオブジェクトがある場合 MyBull そしてa 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); 
役に立ちましたか?

解決

デフォルトでは、オブジェクトは参照ベースの平等を公開します。 IDフィールドに基づいた平等など、カスタムルールが必要な場合は、 EqualsGetHashCode 方法。

他のヒント

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!");

これは、Mybullインスタンスが参照によって比較されているためです。 .netからの観点から、xとyは両方とも さまざまなインスタンス したがって、等しくありません。

これを回避するためには EqualsおよびGethashCodeメソッドをオーバーライドします (つまり、おそらく実装する必要があります IEquatable<MyBull> ==および!=演算子もオーバーライドします。

Mybullオブジェクトは実装していますか IEquatable<T>.Equals?この方法は、2つのオブジェクトの等式を決定します

OPによって要求されました

mybullクラスはi quatableを実装します

public class MyBull : IEquatable<MyBull>

そして、あなたはオーバーライドする必要があります Equals 方法

public bool Equals(MyBull theOtherMyBull)

David Nealeが以下に述べているように、これはあなたが同じタイプのオブジェクトを比較するときに使用するのが最適です。 Overriding object.equals and object.gethashCodeも動作します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top