我正在尝试使用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
内的阻止。
我错过了什么吗? (如果你想我可以从调试器发布屏幕截图 - 或者你想要的其他东西)
答案 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);
}
另外,请不要忘记覆盖Equals
和GetHashCode
方法,以便正确比较两个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();
}
}