对IDictionary Generic进行排序

本文关键字:排序 Generic IDictionary | 更新日期: 2023-09-27 17:59:46

我需要知道是否有任何方法可以在不知道IDictionary的确切类型的情况下对其进行排序。。。

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

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

但需要通过EnumPersonalizado对该字典中的项进行排序,而不管其他类型"something?"有什么

对IDictionary Generic进行排序

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

你能做的最好的事情就是从字典中取出所有的条目,把它们放在其他类型的集合中,然后进行排序。

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

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

有很多合理的理由想要对基于键的字典应用偏序,键无序并不是一个基本的质量,只是给定的键会产生给定的值。

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

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

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

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

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