【问题标题】:C# Dictionary.ContainsKey() always returns falseC# Dictionary.ContainsKey() 总是返回 false
【发布时间】:2011-09-19 19:39:26
【问题描述】:

我有一个字典,每次调用 ContainsKey 方法时它都会返回 false。举个例子

 Boolean found = dict.ContainsKey(new Group("group1", "test"));

尽管 Visual Studio 调试器显示名称为“group1”且类型为“test”的组存在于 dict 中,但找到的变量为 false。怎么回事?

我的 Group 类有两个 String 字段(类型和名称),我重写了 Equals 方法

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

【问题讨论】:

标签: c# .net .net-4.0 dictionary


【解决方案1】:

你应该覆盖GetHashCode method

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

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

【讨论】:

  • 我是 C# 新手,unchecked 关键字有什么作用?还有,为什么你只用名字哈希码乘以 397?
  • unchecked 关键字用于抑制整数类型算术运算和转换的溢出检查。
  • 我知道你为什么选择使用 397 但我很困惑为什么你只将名称哈希码乘以 397 而不是类型哈希码?
  • 此哈希方法由 Resharper 生成。我认为你应该直接问他们;)
【解决方案2】:

你需要覆盖GetHashCode():

http://msdn.microsoft.com/en-us/library/ms182358(v=vs.80).aspx

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

【讨论】:

    【解决方案3】:

    我知道这个问题已经有一个公认的答案,但我也会分享我的dirty解决方案。

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

    【讨论】:

      猜你喜欢
      • 2013-07-11
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2021-02-02
      • 2019-05-11
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多