c# - 基于元组或嵌套的字典有好处吗?

标签 c# dictionary

我一直在寻找一种方法来存储和检索多个值,而不仅仅是 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/

相关文章:

c# - 美国地址验证 (Zip+4)

python - 从 csv 文件中以嵌套的字典格式分别计算男性和女性

python - 将列表转换为字典 python

c# - 什么是 async 和 await,什么时候在 Windows 开发中使用它们?

c# - 如何模拟 HttpContext 以访问 IIdentity 的扩展方法?

c# - 将 ReflectionOnlyType 与 Type 进行比较的推荐方法是什么?

python - 使用字典(python)中的特定键构建列表?

c# - 使用 NAudio 将流数据保存到 WAV 文件

dictionary - 按字典键过滤字典列表

Python 字典与 C++ 标准 :unordered_map (cython) vs cythonized python dict