排序IDictionary Generic

时间:2013-02-15 15:53:26

标签: c# idictionary

我需要知道是否有任何方式订购IDictionary而不知道它究竟是什么类型......

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

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

但是需要通过EnumPersonalizado对这个词典中的项目进行排序,而不管其他类型的东西是什么?“具有

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

请参阅此question。 字典本身没有索引顺序。请考虑继承KeyedCollection类。它是字典和普通列表的合并,它设计为使用项目的成员作为键,并具有索引顺序。

答案 2 :(得分:1)

有很多合理的理由想要基于密钥对字典应用部分排序,关键是无序的基本质量,只有给定的密钥才会产生给定的值。

话虽这么说,如果你发现自己使用的是非通用的IDictionary,那么排序'排序可能会非常麻烦。通过密钥而不知道密钥类型。在我的特定场景中,我想要一个将IDictionary转换为另一个IDictionary的函数,其中的条目可以通过有序键枚举。

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

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

奇怪命名的SortedList可以在System.Collections中找到,并使用ÌComparable界面订购密钥。

答案 3 :(得分:-2)

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