【发布时间】:2014-01-03 18:27:44
【问题描述】:
我有这个遗留代码,其中通常存在字符串字典到字符串字典到某个对象的这种模式。
Dictionary<string, Dictionary<string, someobject>>
对象的检索总是基于两次 TryGetValue
Dictionary<string, Dictionary<string, Dealer>> dicDealers ...
if (dicDealers.TryGetValue(lab, out dealers))
dealers.TryGetValue(dealerNumber, out dealer);
现在我认为将两个字符串键组合成一个具有两个字符串成员的键结构应该更有效,以便一次性检索对象。所以我创建了一个 Key 结构,它覆盖 GetHashCode 和 Equals,计算机器人关键成员的哈希值。
public struct Key<T>
{
private T mKey1;
private T mKey2;
public Key(T t, T u)
{
mKey1 = t;
mKey2 = u;
}
public override bool Equals(object obj)
{
if (obj == null) return false;
Key<T> rhs = (Key<T>)obj;
return mKey1.Equals(rhs.mKey1) && mKey2.Equals(rhs.mKey2);
}
public override int GetHashCode()
{
int hash = 17;
hash = ((hash << 5) - hash) + mKey1.GetHashCode();
hash = ((hash << 5) - hash) + mKey2.GetHashCode();
return hash;
}
}
现在您可以立即完成。
Key<string> key = new Key<string>(lab, dealerNumber);
if (dicDealers.TryGetValue(key, out someobject))
{
...
}
我认为它应该更快,但事实证明这两种方式都一样快。这个怎么可能?我可以做些什么来让第二种技术运行得更快吗?
【问题讨论】:
-
是否存在性能问题?如果不是,则优先考虑可读性,将 Directory 封装在具有检索项目方法的新类中可能是有意义的,因此您不必使用 TryGetValue 调用乱扔代码。
-
这也是为了可读性,是的,但这不是问题
-
那是什么问题?
-
您如何验证这两种方式“差不多快”?
-
我注意到,使用
new key = key1 + "-" + key2不是保留多个嵌套字典,而是易于维护。您必须仔细选择分隔符。