Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用通用词典和/或IDictionary排序_C#_Generics_Sorting_Dictionary_Idictionary - Fatal编程技术网

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(…);