0

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

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

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

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

4

4 回答 4

4

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

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

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

于 2013-02-15T16:21:57.197 回答
1

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

于 2013-02-15T16:22:45.730 回答
1

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

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

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

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

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

于 2014-06-13T17:58:14.223 回答
-2

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

于 2013-02-15T16:11:48.053 回答