如何检查Dictionary是否已经有一个键'x'?

时间:2011-12-10 15:27:29

标签: c# dictionary key

我正在尝试使用C#的词典实现简单的算法:

我的外在&#39;字典看起来像这样:Dictionary<paramID, Dictionary<string, object>> [其中paramID只是一个包含2个字符串的标识符]

如果密钥&#39; x&#39;已经在字典中然后添加特定条目到这个记录的字典,如果它不存在然后将其条目添加到外部字典,然后添加条目到内部字典。

不知何故,当我使用TryGetValue时,它总是返回false,因此它总是在外部Dictionary中创建新条目 - 什么产生重复。

我的代码看起来或多或少像这样:

    Dictionary<string, object> tempDict = new Dictionary<string, object>();

    if(outerDict.TryGetValue(new paramID(xKey, xValue), out tempDict))
    {
     tempDict.Add(newKey, newValue);
    } 

即使外部词典中存在此特定条目,也永远不会执行if内的阻止。

我错过了什么吗? (如果你想我可以从调试器发布屏幕截图 - 或者你想要的其他东西)

2 个答案:

答案 0 :(得分:3)

最有可能的是,paramID没有正确实现相等比较。

应该实现IEquatable<paramID>,这尤其意味着GetHashCode实现必须符合要求(参见“实施者注意事项”)。

至于词典中的键,MSDN说:

  

只要一个对象被用作Dictionary中的一个键(Of TKey,   TValue),它不得以任何影响其哈希值的方式改变。   字典(Of TKey,TValue)中的每个键必须是唯一的   字典的平等比较。一把钥匙不能没什么,而是一个   如果值类型TValue是引用类型,则值可以是。

     

Dictionary(Of TKey,TValue)需要一个相等的实现   确定键是否相等。您可以指定一个实现   IEqualityComparer(Of T)通用接口使用构造函数   接受比较器参数;如果你没有指定   实现,默认的通用相等比较器   EqualityComparer(Of T)。使用默认值。如果类型TKey实现了   System.IEquatable(Of T)泛型接口,默认相等   comparer使用该实现。

由于您没有显示paramID类型,因此我无法详细说明。

顺便说一下:那里有许多关键词和价值观纠结在一起。字典中有一个字典,外部字典的也会聚合某种。也许这种安排可以有利地简化?你究竟想要实现什么目标?

答案 1 :(得分:2)

使用the Dictionary.ContainsKey method

所以:

Dictionary<string, object> tempDict = new Dictionary<string, object>();

paramID searchKey = new paramID(xKey, xValue);
if(outerDict.ContainsKey(searchKey))
{  
   outerDict.TryGetValue(searchKey, out tempDict);
   tempDict.Add(newKey, newValue);
} 

另外,请不要忘记覆盖EqualsGetHashCode方法,以便正确比较两个paramID:

class paramID
{
    // rest of things

    public override bool Equals(object obj)
    {
         paramID p = (paramID)obj;

         // how do you determine if two paramIDs are the same?
         if(p.key == this.key) return true;
         return false;
    }

    public override int GetHashCode()
    {
         return this.key.GetHashCode();
    }
}