Dictionary<TKey, TValue>非常适合使用强类型键进行快速查找; 但有时,我需要根据两个(或更多)变量的唯一组合进行查找.我实现这个的"设计模式"是使用分隔符将值连接在一起,如下所示:
String compoundKey = productID.ToString + "~" + colorID.ToString;
myDict.Add(compoundKey, myObject);
Run Code Online (Sandbox Code Playgroud)
这种方法看起来有点笨拙.这个答案使用了一个,struct但我不相信它会更好.
使字典与复合键一起使用的首选方法是什么?
Sup*_*est 11
如果您的密钥由两部分组成,最明显的解决方案是一个包含两部分的变量.产生这种情况的"经典"方式是struct:
struct MyKey {
public string PartA;
public string PartB;
}
Run Code Online (Sandbox Code Playgroud)
.NET将为两个字段哈希Dictionary<MyKey, object>.最好使用a struct而不是a class,因为默认情况下a的标识class由参考点(类似于C或C++中的指针的概念)而不是字段的值定义.当然,你可以使用你override的Object.GetHashCode方法class- 但是使用一个方法的工作就少了struct.
在实践中,.NET已经为这种情况提供了便利:struct带有2个字段的A 可以表示为a Tuple<string, string>.然后你可以定义:
var d = new Dictionary<Tuple<string, string>, object>
Run Code Online (Sandbox Code Playgroud)
你将索引d[new Tuple<string, string>("some value", "some other value")>].
这看起来有点笨重,因此您可以添加using MyKey = System.Tuple<string, string>到.cs文件的开头.然后你就可以索引了d[new MyKey("some value", "some other value")].该using a = b表示法用作编译时搜索和替换.
使字典使用复合键的首选方法是什么?
我首选的方法是为Key类型创建一个自定义的不可变类.这需要一些工作,但非常干净和清晰,适用于任何类型的组合.
GetHashCode如果需要,您还可以自定义相等计算.
如果您正在使用string或正确实现散列和相等的类型,则可以使用Tuple<T1,T2>.如果复合类型中的值更复杂,或者您需要自定义相等/散列(即:仅比较实体对象中的ID而不是所有属性),则自定义类允许您完全控制相等和散列的方式确定你的钥匙.