当我不需要快速访问其值时,可以使用词典吗?

时间:2014-07-20 13:47:38

标签: c# dictionary

通常,我使用类似列表的字典,但使用不同类型的键。我喜欢快速访问字典中的单个项目而不必循环访问它,直到找到具有正确属性的项目(因为我正在寻找的属性位于Key中)。

但是还有另一种可能的字典用法。我可以使用Key来存储属性A和Value来存储属性B,而无需使用字典的特殊功能。例如,我可以存储一个人员列表,只需将名字存储在密钥中,并将姓氏存储在值中(为简单起见,我们假设不会有两个人具有相同的名字,因为我只是想出一个更好的例子)。我只会使用该字典在foreach循环中循环它并向其添加项目(不删除,排序或访问单个项目)。使用List<KeyValuePair<string, string>>使用Dictionary<string, string>实际上没有区别(至少在我给出的示例中没有 - 我知道我可以例如在列表中存储相同的密钥的多个项目)

所以,总而言之,当我不需要使用字典提供的特殊功能时,我应该怎么做,只是用它来存储具有两个属性的东西:

  • 使用Dictionary<,>
  • 使用List<KeyValuePair<,>
  • 使用List<MyType>,其中MyType是包含两个属性和构造函数的自定义类。

3 个答案:

答案 0 :(得分:19)

不要使用字典。

如果您不想为此目的创建类,请使用List<Tuple<T1,T2>>之类的内容。但请记住,自定义类将更具可读性和灵活性。

原因如下:如果您使用正确的数据结构,那么很多会更容易阅读您的代码。使用字典只会使读者感到困惑,并且在重复键显示的那天你会遇到问题。

如果有人读取您的代码并看到正在使用Dictionary,他会假设您真的想要使用类似地图的结构。您的代码应该清晰,并且在阅读时 intent 应该是显而易见的。

答案 1 :(得分:6)

如果您关注有效,则应该将数据存储在List中。 Dictionary有很多内部开销。内存和CPU都是。

如果您只关心可读性,请选择最能捕捉您意图的数据结构。如果要存储键值对(例如,错误跟踪器问题中的自定义字段),请使用Dictionary。如果您只是存储没有某种逻辑密钥的项目,请使用List

创建自定义类以用作List中的项目几乎不需要任何工作。使用Dictionary只是因为它为每个项目提供了Key属性是对该数据结构的误用。创建一个也具有Key属性的自定义类很容易。

答案 2 :(得分:2)

使用List<MyType>,其中MyType包含所有值。

字典方法的问题在于它不灵活。如果您以后决定添加中间名,则需要重新设计整个数据结构,而不是仅向MyType添加另一个字段。