This question already has answers here:
Dictionary KeyNotFoundException even though Key exists
                                
                                    (3个答案)
                                
                        
                        
                            KeyNotFoundException in filled dictionary
                                
                                    (2个答案)
                                
                        
                                在10个月前关闭。
            
                    
我无法通过键找到字典条目。我有一个如下界面:

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


然后我有一个像这样的字典:

Dictionary<IFieldLookup, IField> fd


当我尝试通过键从字典中检索元素时,出现KeyNotFoundException。我假设我必须执行某种类型的比较-如果我的假设正确,那么在这种情况下建议的比较方法是什么?

最佳答案

由于这是一个接口而不是一个类,因此您必须为实现该接口的每个类定义相等运算符。这些操作员将需要稳定地操作。 (如果它是一个类而不是一个接口,那会更好。)

您必须在每个类上覆盖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);
}


取决于您希望它如何表现。

关于c# - 在通用词典中找不到关键字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2389110/

10-10 17:02