【问题标题】:Sorting IDictionary Generic对字典泛型进行排序
【发布时间】:2013-02-15 15:53:25
【问题描述】:

我需要知道是否有任何方法可以在不知道它到底是什么类型的情况下订购 IDictionary ...

例如,我有一个接收对象的方法,其中我有一个 Dictionary 对象......我只知道它是一个 Dictionary 所以我可以这样做:

public void MyMethod(PropertyInfo propriedadeParametro, object parameters){
   IDictionary dictionary = ((IDictionary) propriedadeParametro.GetValue (parameters, null));
}

但需要按 EnumPersonalizado 对本词典的项目进行排序,而不管其他类型“某事?”有

【问题讨论】:

  • 什么是EnumPersonalizadoSomething 是什么?发布您的完整代码
  • “EnumPersonalizado”和字典有什么关系?
  • 字典中的所有键是否都属于同一类型(可能未知)?
  • “什么?”可以是任何东西 EnumPersonalizado 是一个 Enum... Dictionary
  • 您想要按something 排序的条目吗?如果字典中有不同类型的“某物”怎么办?你如何比较汽车、狗和星期一?

标签: c# idictionary


【解决方案1】:

您无法对字典进行排序。根据定义,字典没有其中项目的“顺序”。这些项目存储在某种超出您控制范围的机制中,旨在使其尽可能高效地添加、删除和搜索。

您能做的最好的事情就是从字典中取出所有项目,将它们放入其他类型的集合中,然后对其进行排序。

至于您的具体情况,我们不清楚字典中键或值的类型是什么,需要知道这些类型才能尝试对数据进行排序。

【讨论】:

    【解决方案2】:

    看到这个question。 字典本身没有索引顺序。考虑改为从 KeyedCollection 类继承。它是字典和普通列表的合并,旨在使用您的项目的成员作为键,并具有索引顺序。

    【讨论】:

      【解决方案3】:

      有很多正当理由希望基于键对字典应用部分排序,键无序并不是基本特性,只是给定键会产生给定值。

      话虽如此,如果您发现自己使用的是非泛型 IDictionary,那么在不知道密钥类型的情况下按密钥“排序”实际上会很麻烦。在我的特定场景中,我想要一个函数,它将一个 IDictionary 转换为另一个 IDictionary,其中条目可以通过有序键枚举。

      IDictionary ToSortedDictionary(IDictionary dictionary) {
          return new SortedList(dictionary);
      }
      

      这将构造一个新的字典实例,以便遍历 (foreach) 将根据键的排序顺序访问条目。

      奇怪的名字SortedList可以在System.Collections中找到,并使用ÌComparable接口排序键。

      【讨论】:

      • 将一堆数据插入SortedList 是一种非常低效的数据排序方式。将 N 项插入排序列表是 O(n^2) 操作,而任何合理的排序都将是 O(nlog(n)) 操作。 .NET 提供了大量的信息排序方式,例如 LINQ 的 OrderBy(这在这种情况下可能是最简单的)。
      • 这是一个很好的观点,我应该提到在我的情况下,我还需要一个 IDictionary 在另一端。
      • 需要对数据结构进行排序和从键中查找值的方法通常没有什么意义,但如果这是你需要的,那么使用SortedDictionary .
      • @Servy 我不需要在运行时有一个不断排序的集合。我只需要在序列化之前立即实现一个排序字典。此外,我所拥有的只是一个非通用的IDictionary,不知道密钥类型。为了避免大量反思(似乎 OP 采取了这种做法),我需要一个前通用时代的旧风格集合,这排除了 SortedDictionarySortedList 恰好很好地满足了所有这些要求,我相信在这个(诚然)狭窄的场景中它可能对某人有用,但我会编辑问题以澄清。
      【解决方案4】:

      IDictionary 是 IEnumerable,因此您可以尝试执行类似new ArrayList(dictionary).Sort() 的操作,但它会尝试将成员强制转换为 IComparable,或者您可以使用接受 IComparer 对象的排序重载。 另一种方法是使用反射 - 首先找到实际的键/值类型,然后创建对通用 OrderBy 的调用。

      【讨论】:

      • 对字典进行排序的整个概念没有意义。根据定义,字典是无序的。
      • @Servy 这并不禁止我们希望以某种对用户合乎逻辑的顺序显示内容。
      • 好吧最终不得不选择通过反射来做,我将字典分成两个列表,一个带有键的 IList 和带有值的 IList 我做了一个循环手动排序是一个非常混乱的代码,但没有找到其他选择...谢谢
      • @Maicon - 我确信有一种不那么混乱的方法,但你没有给我们足够的信息来帮助我们。查看上面 cmets 中提出的所有问题。
      猜你喜欢
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 2023-04-05
      相关资源
      最近更新 更多