我需要知道是否有任何方式订购IDictionary而不知道它究竟是什么类型......
例如,我有一个接收对象的方法,在其中我有一个Dictionary对象...我所知道的是它是一个字典 所以我可以这样做:
public void MyMethod(PropertyInfo propriedadeParametro, object parameters){
IDictionary dictionary = ((IDictionary) propriedadeParametro.GetValue (parameters, null));
}
但是需要通过EnumPersonalizado对这个词典中的项目进行排序,而不管其他类型的东西是什么?“具有
答案 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的调用。