代码之家  ›  专栏  ›  技术社区  ›  dugas

在通用字典中找不到键[重复]

  •  1
  • dugas  · 技术社区  · 16 年前

    我找不到一个按键的字典条目。我有如下界面:

    public interface IFieldLookup
    {
        string FileName { get; set; }
        string FieldName { get; set; }
    }
    

    然后我有一本这样的字典:

    Dictionary<IFieldLookup, IField> fd
    

    当我尝试用键从字典中检索元素时,我得到了keynotFoundException。我假设我必须实现某种类型的比较——如果我的假设是正确的,那么在这种情况下,推荐的实现比较的方法是什么?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Jeffrey L Whitledge    16 年前

    由于这是接口而不是类,因此必须为实现接口的每个类定义相等运算符。而这些运营商需要始终如一地运营。(如果它是一个类而不是一个接口,这会更好。)

    您必须覆盖 Equals(object) GetHashCode() 每个类的方法。

    可能是这样的:

    public override bool Equals(object obj)
    {
       IFieldLookup other = obj as IFieldLookup;
       if (other == null)
            return false;
       return other.FileName.Equals(this.FileName) && other.FieldName.Equals(this.FieldName);
    }
    
    public override int GetHashCode()
    {
        return FileName.GetHashCode() + FieldName.GetHashCode();
    }
    

    或者:

    public override bool Equals(object obj)
    {
       IFieldLookup other = obj as IFieldLookup;
       if (other == null)
            return false;
       return other.FileName.Equals(this.FileName, StringComparison.InvariantCultureIgnoreCase) && other.FieldName.Equals(this.FieldName, StringComparison.InvariantCultureIgnoreCase);
    }
    
    public override int GetHashCode()
    {
        return StringComparer.InvariantCulture.GetHashCode(FileName) +
               StringComparer.InvariantCulture.GetHashCode(FieldName);
    }
    

    这取决于你希望它如何表现。

        2
  •  5
  •   Peter    16 年前

    在key类上使用containsKey和override equals

    好吧,假设这是我们的重点课程:

    class Key
    {
      public int KeyValue;
      public override Equals(object o)
      {
        return ((Key)o).KeyValue == KeyValue);
      }
    }
    

    现在让我们用类作为键

    Dictonary<Key, string> dict = new Dictonary<Key, string>();
    Key k = new Key();
    k.KeyValue = 123;
    dict.Add(k, "Save me!");
    Key k2 = new Key();
    k2.KeyValue = 123;
    if (dict.ContainsKey(k2))
    {
      string value = dict[k2];
    }
    
        3
  •  1
  •   Sam Harwell    16 年前

    实现的实例 IEqualityComparer<T> (建议来源于 EqualityComparer<T> 自动执行 IEqualityComparer 以及)对于键类型,并将实例传递给字典构造函数。通过这种方式,您可以在接口的多个实现中一致地实现比较。