List.Containsは、期待どおりに機能していません
-
23-10-2019 - |
質問
タイプのオブジェクトがある場合 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フィールドに基づいた平等など、カスタムルールが必要な場合は、 Equals
と GetHashCode
方法。
他のヒント
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も動作します。
所属していません StackOverflow