C# C Dictionary.ContainsKey()始终返回false

C# C Dictionary.ContainsKey()始终返回false,c#,.net,.net-4.0,dictionary,C#,.net,.net 4.0,Dictionary,我有一个字典,每次调用ContainsKey方法时,它都返回false。以下面的例子为例 Boolean found = dict.ContainsKey(new Group("group1", "test")); 如果visual studio调试器显示dict中存在名为group1且类型为test的组,则找到的变量为false。发生了什么 我的组类有两个字符串字段type和name,我重写了Equals方法 public override bool Equals(object obj)

我有一个字典,每次调用ContainsKey方法时,它都返回false。以下面的例子为例

 Boolean found = dict.ContainsKey(new Group("group1", "test"));
如果visual studio调试器显示dict中存在名为group1且类型为test的组,则找到的变量为false。发生了什么

我的组类有两个字符串字段type和name,我重写了Equals方法

public override bool Equals(object obj)
{
    Group otherGroup = (Group)obj;
    return this.name == otherGroup.name && this.type == otherGroup.type;
}
你应该重写

包含2个字符串属性的类的HashMethod示例

public override int GetHashCode()
{
    unchecked
    {
        return ((name != null ? name.GetHashCode() : 0)*397) ^ (type != null ? type.GetHashCode() : 0);
    }
}
你应该重写

包含2个字符串属性的类的HashMethod示例

public override int GetHashCode()
{
    unchecked
    {
        return ((name != null ? name.GetHashCode() : 0)*397) ^ (type != null ? type.GetHashCode() : 0);
    }
}
您需要重写GetHashCode:

GetHashCode基于当前实例返回一个值,该值适用于哈希算法和数据结构(如哈希表)。相同类型且相等的两个对象必须返回相同的哈希代码,以确保System.Collections.HashTable和System.Collections.Generic.Dictionary的实例正常工作

您需要重写GetHashCode:

GetHashCode基于当前实例返回一个值,该值适用于哈希算法和数据结构(如哈希表)。相同类型且相等的两个对象必须返回相同的哈希代码,以确保System.Collections.HashTable和System.Collections.Generic.Dictionary的实例正常工作


我知道这个问题已经有了一个公认的答案,但我也将分享我肮脏的解决方案

Boolean found = 
   dict.Keys.Any(key => 
                 key.Equals("key", StringComparison.InvariantCultureIgnoreCase));

我知道这个问题已经有了一个公认的答案,但我也将分享我肮脏的解决方案

Boolean found = 
   dict.Keys.Any(key => 
                 key.Equals("key", StringComparison.InvariantCultureIgnoreCase));

GetHashCode也被重写了吗?看起来您被烧死了。请参阅:如果重写Equals,则应始终重写GetHashCode,以便它为组对象返回唯一值。另外,副本:@CoryLarson感谢您的问题参考;我在我的Search中找不到该值,GetHashCode也被覆盖了?看起来您被烧死了。请参阅:如果覆盖Equals,则应始终覆盖GetHashCode,以便它为组对象返回唯一值。另外,副本:@CoryLarson感谢您的问题参考;我在我的搜索中没有找到我是C新手未选中的关键字有什么作用?另外,为什么只将名称哈希代码乘以397?unchecked关键字用于禁止整数类型算术运算和转换的溢出检查。397是一个素数。我知道你为什么选择使用397,但我不明白为什么你只将名称哈希代码乘以397,而不将类型哈希代码乘以397?这个哈希方法是由Resharper生成的。我认为你应该直接问他们;我是C新手,unchecked关键字做什么?另外,为什么只将名称哈希代码乘以397?unchecked关键字用于禁止整数类型算术运算和转换的溢出检查。397是一个素数。我知道你为什么选择使用397,但我不明白为什么你只将名称哈希代码乘以397,而不将类型哈希代码乘以397?这个哈希方法是由Resharper生成的。我认为你应该直接问他们;