【问题标题】:Sorting elements in a HashTable, Dictionary or such对 HashTable、Dictionary 等中的元素进行排序
【发布时间】:2012-11-24 08:30:59
【问题描述】:

我有一组由名称和相关内容组成的数据。因此,我会使用 HashTableDictionary 之类的东西来存储这些项目。

我需要按两个优先级对这些数据进行排序。首先它们应该按字母顺序排列,然后一些项目应该按特定顺序放在开头。

如果字母顺序是我唯一的要求,我会使用SortedDictionary。该字典根据键自动对元素进行排序。

我正在寻找的是一个允许我做的课程:

  1. 以随机顺序添加元素
  2. 按字母顺序对所有元素进行排序
  3. 将元素移动(或删除和插入)到开头(或更通用:在我想要的任何位置)。

【问题讨论】:

  • 理论上你能想出一个比较方法来指定顺序吗?如果是这样,您可以使用几个集合类(我会发布正确的答案)。
  • @MatthewWatson 嗯,是的,也不是。我必须在这个比较方法中实现这些特定元素的正确顺序。不确定这是否是一个不错的解决方案。不过可以这样做。

标签: c# sorting dictionary hashtable


【解决方案1】:

为什么不看看SortedList<TKey, TValue>

它应该有适当的功能让你做你想做的事情并且排序很快!

【讨论】:

  • 嗯,这个集合没有所有合适的功能,但我实现了比较方法以满足我的需要。接受,因为这种方法最接近我的要求,而其他所有答案也都很好。
【解决方案2】:

如果此数据的名称可以重复,您没有提供信息。一般来说,我认为您可以使用不同的方式来保存这些数据。您应该记住,字典的本质是保存键是唯一的键/值数据。元素的顺序不是字典的本质。在我看来,这更重要。因此,您可以尝试将 Dictionary 与 Linq to Objects 混合使用。但也许尝试使用通用

    List< KeyValuePair< TKey, TValue>>.

【讨论】:

  • 好主意。我试试看。
【解决方案3】:

没有内置集合可以满足您的需要,但您可以相对轻松地构建自己的集合:

  • 编写IDictionary&lt;TKey,TValue&gt;的实现
  • 在里面放一个Dictionary&lt;TKey,TValue&gt; dict和一个List&lt;TKey&gt; keys
  • 将元素添加到dict 时,也将其键添加到keys
  • 当请求迭代时,迭代keys,然后在dict 中查找条目

如果您的集合以这种方式组织,您将能够独立于字典条目重新排序键。由于在更改字典的操作中应该进行双重“簿记”,因此您在实施中需要小心。除此之外,解决方案应该相对简单。

【讨论】:

  • 我希望避免两次保留密钥。但我认为这种方法是实现简洁解决方案的一种非常明智的方式。
猜你喜欢
  • 1970-01-01
  • 2011-05-19
  • 2017-06-14
  • 2018-01-25
  • 2015-08-23
  • 1970-01-01
  • 2016-01-08
  • 2012-12-26
  • 1970-01-01
相关资源
最近更新 更多