C# WPF ComboBox.ObjectCollection.IndexOf 方法(对象)在具有相同值的其他对象的 ComboBox 中找不到对象

C# WPF ComboBox.ObjectCollection.IndexOf Method (Object) can't find Object in ComboBox with an other object with the same value

我有一个包含 IdDataClass 对象的 Combobox,我想在我的 ComboBox 中查找 IdDataClass 的索引,其中的 IdDataClass 的参数与 ComboBox 中的参数相同。

IdDataClass Instance1 = new IdDataClass(0, "Text");
IdDataClass Instance2 = new IdDataClass(0, "Text");
MyComboBox.Items.Add(Instance1);

int Index = MyComboBox.Items.IndexOf(Instance1);

这个例子会起作用,return ContactClientIdDataClass1 的索引 但是这个

IdDataClass Instance1 = new IdDataClass(0, "Text");
IdDataClass Instance2 = new IdDataClass(0, "Text");
MyComboBox.Items.Add(Instance1);

int Index = MyComboBox.Items.IndexOf(Instance2);

index 的值为 -1 将不起作用。我的问题是为什么我找不到 instance1 和 instance2 的索引。他们有完全相同的价值?

Ps。我尝试重载我的 IdDataClass 的 Equals 函数:

public class IdDataClass
{
     int _ID;
    string _MyData;

    public IdDataClass(int ID, string Data)
    {
        _ID = ID;
        _MyData = Data;
    }
    public bool Equals(IdDataClass p)
    {
        if ((object)p == null)
        {
            return false;
        }
        return (_ID == p._ID)&&(_MyData == p._MyData);
    }
}

试试这个:

    public class IdDataClass : IEquatable<IdDataClass>
{
    int _ID;
    string _MyData;

    public IdDataClass(int ID, string Data)
    {
        _ID = ID;
        _MyData = Data;
    }

    public bool Equals(IdDataClass p)
    {
        return (_ID == p._ID) && (_MyData == p._MyData);
    }

    public override bool Equals(object obj)
    {
        if (obj == null || !(obj is IdDataClass))
            return false;
        else
            return Equals(obj as IdDataClass);
    }

    public override int GetHashCode()
    {
        return _ID.GetHashCode() ^ _MyData.GetHashCode();
    }
}

当p为null时,这一行if ((object)p == null)会抛出异常,简单的p==null即可。

_ID 和 _MyData 是私有的,因此您不能像

那样访问它们
return (_ID == p._ID)&&(_MyData == p._MyData);

当您使用 IndexOf() 时,该方法使用 Object.Equals() 来确定两个对象是否相似。所以你自己的 Equals 方法永远不会被调用,因为它不是同一个方法。您必须重写 Equals 方法才能获得所需的行为。添加以下行:

public override bool Equals(object obj)
{
    IdDataClass otherObject = obj as IdDataClass;
    if (otherObject == null)
        return false;
    else
        return Equals(otherObject );
}

public override int GetHashCode()
{
    return _ID.GetHashCode() + _MyData.GetHashCode();
}

应该覆盖 GetHashCode(),因为您永远不知道这些项目是如何存储在集合中的。它可能使用某种 HashTable 来提高性能。您应该明确指出相等的实例(根据您的实现)return 具有相同的哈希码。