【问题标题】:How to disable sorting in a Dictionary? [duplicate]如何禁用字典中的排序? [复制]
【发布时间】:2013-07-13 10:44:48
【问题描述】:

我正在使用Dictionary<string, object>,但我遇到了一个问题,我需要按照它们在字典中的放置顺序来保存项目,而不是按照相应键的字母顺序。

有没有办法禁用添加项目的排序,或者使用其他一些自定义类更好(我想保持所有dic[key] = value 和其他访问器原样)?

如果不能使用 Dictionary,我还能使用什么仍然按键返回项目?

【问题讨论】:

  • 查看this answer 的类似问题(不是骗人的,而是相关的)
  • SortedList 和 SortedDictionary 已排序。在钥匙上。
  • 查找性能与保持原始排序顺序相比有多重要?
  • 一点也不重要。按键添加和删除项目很方便。

标签: c# sorting dictionary


【解决方案1】:

对象存储在Dictionary<> 对象中的顺序不能保证是任何特定顺序。它只是针对按键访问进行了优化。如果你需要保证对象的顺序,那么你应该使用Dictionary<>以外的其他东西

显然有一个SortedDictionary<> 类。我什至没有想过要寻找它,因为它似乎与字典有点对立......

【讨论】:

  • 问题是要求一个有序但未排序的字典。
【解决方案2】:

我需要按照它们在字典中的顺序保留项目,

这不符合字典的主要职责。

您可以使用List&lt;KeyValuePair&lt;K,V&gt;&gt; 或其他方式来满足您的要求。使用索引器将其包装在一个类中以获得dic[key] = value 语法。

【讨论】:

    【解决方案3】:

    Dictionary&lt;TKey, TValue&gt;中没有订单之类的东西:

    出于枚举的目的,字典中的每个项目都被视为 一个 KeyValuePair 结构,表示一个值及其 钥匙。 项目返回的顺序未定义。

    【讨论】:

      【解决方案4】:

      你可以用这个:

      List<KeyValuePair<T1,T2>>
      

      该列表确实保持插入顺序与字典相反,其中顺序在内部定义。

      编辑:

      既然你想要排序和 [] getter, 如果您没有内存问题,您可以构建一个包装类,将值保存在两个内部集合中:

      一个列表和一个字典。 您将按索引(来自列表)和键(来自字典)提供包装器 getter。 列表和字典都需要是私有的,一定要从两个集合中添加和删除对象。

      【讨论】:

      • 我想我必须实现 kvpList[key] = valuekvp = kvpList[key]?
      • Tim 的回答中的 SortedDictionary 是要走的路。以前没听说过...
      猜你喜欢
      • 2016-03-31
      • 2013-06-09
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 2020-08-03
      • 2013-03-14
      • 2014-06-14
      • 1970-01-01
      相关资源
      最近更新 更多