Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WPF ComboBox.ObjectCollection.IndexOf方法(对象)可以';在组合框中找不到具有相同值的其他对象_C#_Wpf_Combobox_Indexof - Fatal编程技术网

C#WPF ComboBox.ObjectCollection.IndexOf方法(对象)可以';在组合框中找不到具有相同值的其他对象

C#WPF ComboBox.ObjectCollection.IndexOf方法(对象)可以';在组合框中找不到具有相同值的其他对象,c#,wpf,combobox,indexof,C#,Wpf,Combobox,Indexof,我有一个包含IdDataClass对象的Combobox,我想在我的Combobox中找到一个IdDataClass的索引,其中一个IdDataClass的参数与Combobox中的参数相同 IdDataClass Instance1 = new IdDataClass(0, "Text"); IdDataClass Instance2 = new IdDataClass(0, "Text"); MyComboBox.Items.Add(Instance1); int Index = MyCo

我有一个包含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);
此示例将起作用,并将返回ContactClientDataClass1的索引 但是这个

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

int Index = MyComboBox.Items.IndexOf(Instance2);
如果索引的值为-1,则将不起作用。我的问题是为什么我找不到instance1和instance2的索引。它们的值完全相同

另外,我试图重载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();
    }
}
public类IdDataClass:IEquatable
{
内部ID;
字符串_MyData;
公共IdDataClass(整数ID,字符串数据)
{
_ID=ID;
_MyData=数据;
}
公共布尔等于(IdDataClass p)
{
返回(_ID==p._ID)&(_MyData==p._MyData);
}
公共覆盖布尔等于(对象对象对象)
{
if(obj==null | |!(obj是IdDataClass))
返回false;
其他的
返回等于(obj作为IdDataClass);
}
公共覆盖int GetHashCode()
{
返回_ID.GetHashCode()^_MyData.GetHashCode();
}
}

当p为null时,如果((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()
的操作应该完成,因为您永远不知道这些项是如何存储在集合中的。它可能使用某种哈希表来提高性能。您应该明确,相等的实例(根据您的实现)返回相同的哈希代码。

==将无法按您希望的方式工作。看,我只是再次测试我的重载函数,它正在工作。如果相同的字符串返回true,如果不同的字符串返回false如果其中一个答案帮助您解决了问题,请将其标记为已接受。如果不让我们知道什么不起作用,那么我们可以改进我们的答案。我知道这是因为我下周三才在家:(我真的很兴奋尝试你的答案,因为你告诉了我我错过了什么:)这不是一条遗漏的线,这是我问题的全部重点!和IdDataClass._ID是数据库中我的联系人的主键,_MyData是字符串中我的联系人的firsname和lastname。我简化了代码以隐藏SQL C#复杂性非常感谢这正是我的问题:)现在它工作得很好!!