4

を使用するときは、適切な比較を実行しようとしていますList.Contains(T item)

問題はBaseItem、リスト項目として使用していることです。そして、リスト内の 1 つのオブジェクトに、追加する予定のオブジェクトと同じプロパティ値があるかどうかを確認する必要があります。

例えば:

public abstract class BaseItem
{
    // some properties

    public override bool Equals(object obj)
    {
        return obj != null && this.GetType() == obj.GetType();
    }
}

public class ItemA : BaseItem
{
    public int PropertyA { get; set; }

    public override bool Equals(object obj)
    {
        if (base.Equals(obj) == false)
            return false;

        return (this.PropertyA == (obj as ItemA).PropertyA;
    }
}

public class ItemB : BaseItem
{
    public int PropertyB { get; set; }

    public override bool Equals(object obj)
    {
        if (base.Equals(obj) == false)
            return false;

        return this.PropertyB == (obj as ItemB).PropertyB;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        List<BaseItem> items = new List<BaseItem>()
        {
            new ItemB() { PropertyB = 3 },
            new ItemA() { PropertyA = 2 },
            new ItemB() { PropertyB = 2 }
        };

        BaseItem newItem = new ItemA() { PropertyA = 2 };
        items.Contains(newItem);  // should return 'True', because the first element is equals than 'newItem'
    }
}

メソッドをオーバーライドするのが正しいのか、Equalsそれとも IEquality インターフェイスを実装する必要があるのか​​ わかりません。

4

1 に答える 1

3

コレクションのメンバーシップ (リストのメンバーシップ、ハッシュセットのメンバーシップなど) をテストする標準的な方法は、.Contains メソッドを使用することIEquatable<T>.Equalsです。のデフォルトの実装IEquatable<T>.Equals(独自の実装を提供しない場合) は ) を使用しますObject.Equals(Object)

必ず実装できますIEquatable<T>。これにより、Contains チェックのパフォーマンスがわずかに向上します。msdn.microsoft.com/en-us/library/ms131190.aspx を参照してください。

実装IEquatable<T>する場合でも、オーバーライドObject.EqualsObject.GetHashCodeて一貫した動作を提供する必要があります

Equals を実装する場合は、Object.Equals(Object) および GetHashCode の基本クラスの実装もオーバーライドして、それらの動作が IEquatable.Equals メソッドの動作と一致するようにする必要があります。

http://msdn.microsoft.com/en-us/library/ms131190.aspx

関連する議論については、この質問を参照してください

C# での Equals()、GetHashCode() のオーバーライドを簡素化して保守性を向上

于 2012-07-18T16:33:17.207 に答える