C# 使用通用词典和/或IDictionary排序
我有一个字典,其中的值是在运行时确定的。我可以将它创建为一个C# 使用通用词典和/或IDictionary排序,c#,generics,sorting,dictionary,idictionary,C#,Generics,Sorting,Dictionary,Idictionary,我有一个字典,其中的值是在运行时确定的。我可以将它创建为一个IDictionary,并添加到其中,但我无法排序。 是否有方法将其创建为词典,以便我可以访问OrderBy,或者是否有其他方法将其排序为IDictionary void func (PropertyDescriptor prop) { //Create dynamic dictionary Type GenericTypeDictionary = typeof(Dictionary<,>); Type Spec
IDictionary
,并添加到其中,但我无法排序。
是否有方法将其创建为词典
,以便我可以访问OrderBy
,或者是否有其他方法将其排序为IDictionary
void func (PropertyDescriptor prop)
{
//Create dynamic dictionary
Type GenericTypeDictionary = typeof(Dictionary<,>);
Type SpecificTypeDictionary = GenericTypeDictionary.MakeGenericType(typeof(T), prop.PropertyType);
var genericDictionary = Activator.CreateInstance(SpecificTypeDictionary) as IDictionary ;
//Add some items to it
//....
//Sort items (this line doesn't compile)
genericDictionary = genericDictionary.OrderBy(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
}
void func(PropertyDescriptor属性)
{
//创建动态字典
类型GenericTypeDictionary=typeof(字典);
类型SpecificTypeDictionary=GenericTypeDictionary.MakeGenericType(typeof(T),prop.PropertyType);
var genericDictionary=Activator.CreateInstance(SpecificTypeDictionary)作为IDictionary;
//添加一些项目到它
//....
//对项目进行排序(此行不编译)
genericDictionary=genericDictionary.OrderBy(x=>x.Value).ToDictionary(x=>x.Key,x=>x.Value);
}
忽略您尝试执行的操作可能没有意义这一点,您可以创建一个从IDictionary
到IEnumerable
的适配器:
IEnumerable枚举项(IDictionary d)
{
foreach(d中的词典入口)
{
收益率;
}
}
// ...
genericDictionary=枚举条目(genericDictionary).OrderBy(…).ToDictionary(…);
(出于某种原因,我没有进一步研究,使用
genericdicdictionary.Cast()
而不是helper方法对我不起作用,但这可能是一个单一的怪癖。)忽略您试图做的事情可能没有意义这一点,您可以创建一个从IDictionary
到IEnumerable
的适配器:
IEnumerable枚举项(IDictionary d)
{
foreach(d中的词典入口)
{
收益率;
}
}
// ...
genericDictionary=枚举条目(genericDictionary).OrderBy(…).ToDictionary(…);
(由于某些原因,我没有进一步调查,使用
genericdicdictionary.Cast()
代替helper方法对我不起作用,但这可能是一个单一的怪癖。)的可能重复项不会对字典排序,然后调用ToDictionary()
不管怎样,只要以随机的顺序结束这些项目就行了?只有在您的字典对键和值都是通用的情况下,Tim的链接才有效。是否可以将PropertyDescriptor prop作为泛型成员,以便您可以将特定词典用作词典?的可能副本不会对词典排序,然后调用ToDictionary()
不管怎样,只要以随机的顺序结束这些项目就行了?只有在您的字典对键和值都是通用的情况下,Tim的链接才有效。可以将PropertyDescriptor prop作为泛型成员,这样您就可以使用特定的字典作为字典了?但是您不能对一系列的字典进行排序Entry
,键和值都属于对象类型
,所以您回到了原点。@Jon不,不是真的。您可以将键
或值
转换为i可比较
,如果您知道这是您将要得到的。您可以有一个与PropertyDescriptor
关联的IComparer
,您知道它将以某种方式使用该属性。(这些都不是类型安全的,但是如果您使用PropertyDescriptors
而不是使用Expression
s来描述属性,就不能真正实现类型安全。)而且无论哪种方式,OrderBy
实际上都不会对比较键类型施加任何约束,因此它肯定会编译。嗯。。。我当时的印象是,OrderBy
要求TKey
具有I可比性
,但事实并非如此。对于记录,它在运行时检查该类型,如果它不是i可比较的
,则给出一个ArgumentException
。所以+1是学习新东西的机会:)但是你不能对一系列的字典进行排序进入--键和值都是对象的类型,所以你回到了原点。@Jon不,不是真的。您可以将键
或值
转换为i可比较
,如果您知道这是您将要得到的。您可以有一个与PropertyDescriptor
关联的IComparer
,您知道它将以某种方式使用该属性。(这些都不是类型安全的,但是如果您使用PropertyDescriptors
而不是使用Expression
s来描述属性,就不能真正实现类型安全。)而且无论哪种方式,OrderBy
实际上都不会对比较键类型施加任何约束,因此它肯定会编译。嗯。。。我当时的印象是,OrderBy
要求TKey
具有I可比性
,但事实并非如此。对于记录,它在运行时检查该类型,如果它不是i可比较的
,则给出一个ArgumentException
。因此+1是学习新事物的机会:)
IEnumerable<DictionaryEntry> EnumerateEntries(IDictionary d)
{
foreach (DictionaryEntry de in d)
{
yield return de;
}
}
// ...
genericDictionary = EnumerateEntries(genericDictionary).OrderBy(…).ToDictionary(…);