4

当我使用List.Contains(T item).

问题是我BaseItem用作列表项。我需要验证列表中的一个对象是否具有与我计划添加的对象相同的属性值。

例如:

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>。这将略微提高包含检查的性能。请参阅 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 回答