我一直在寻找一种方法来存储和检索多个值,而不仅仅是 C# 的通用 Dictionary 类提供的单个键。
在网上搜索 ( and on SO itself ) 向我展示了几个选项:
基于元组的字典
.NET 4.0 使支持通用 Tuple<,> 类变得容易。这意味着您可以从任意元组中创建一个字典,即,
-
var myDict = new Dictionary<Tuple<Char, Int>, MyClass>();
嵌套字典
我了解到您还可以在字典中嵌套字典,这使得访问存储的结果类似于访问 N 维数组。例如:
Dictionary<int, Dictionary<int, Dictionary<Char, MyClass>>>
然后可以通过以下方式访问:MyClass foo = MyData[8][3]['W'];
带分隔符的串联键字典
虽然两者都能很好地处理复杂数据和自定义类,但我想知道它们是否总是必需的。至少对于原始数据,似乎将键与定界符连接起来同样有效。
//keys are char + int
Dictionary<string, MyClass> myDict = New Dictionary<string, Myclass>();
String input = myChar + "|" + myInt
MyClass foo = myDict[input]
是否存在使这些方法中的一种优于另一种的情况?他们会有相似的表演时间吗?或者应该将重点放在哪种方法提供最干净、最容易维护的代码上?
想法?
最佳答案
带分隔符的串联键字典
至少有三个我会避免这种方法的原因:
- 这很神奇。键的类型中没有任何内容告诉您如何构造它或它代表什么。
- 如果分隔符不小心显示为值之一,则您的方法失败。
- 转换为字符串以及比较这些字符串可能比使用两种原始类型(稍微)慢。
嵌套字典
这解决了分隔符的问题,但引入了一些新问题:
- 插入新值很困难,因为对于每个嵌套级别,您都必须检查该键是否已存在。如果不是,则需要创建一个新字典作为值。这使得使用字典变得更加困难。
- 会有进一步的内存和性能开销。
基于元组的字典
在您发布的方法中,这可能是最好的。
但您可以更进一步,为您的 key 创建一个命名的不可变 struct
。这将使您的字典更易于使用,因为键的各个部分可以有有用的名称。
关于c# - 基于元组或嵌套的字典有好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11908991/