2013-02-23 51 views
2

我有一個字典,其中的值是在運行時確定的。我可以創建它作爲IDictionary並添加到它很好,但我無法排序。 有沒有辦法將它創建爲Dictionary,所以我可以訪問OrderBy或者有其他方法將它排序爲IDictionary使用通用字典和或用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); 
} 
+0

可能重複的[你如何按值排序C#字典?](http:// stackoverflow。 COM /問題/ 289 /怎麼辦,你排序-AC鋒利字典由-v alue) – 2013-02-23 21:17:33

+2

不會對字典進行排序,然後調用'ToDictionary()'最終只是以random-ish命令中的項目結束? – millimoose 2013-02-23 21:23:54

+0

Tim的鏈接只有在您的字典對鍵和值都是通用的時纔有效。是否可以使PropertyDescriptor prop成爲通用成員,因此您可以將特定Dictionary用作字典? – Larry 2013-02-23 21:26:20

回答

4

忽略的一點是,你正在試圖做可能沒有什麼意義的,你可以剛剛從IDictionary創建一個適配器來IEnumerable<DictionaryEntry>

IEnumerable<DictionaryEntry> EnumerateEntries(IDictionary d) 
{ 
    foreach (DictionaryEntry de in d) 
    { 
     yield return de; 
    } 
} 

// ... 

genericDictionary = EnumerateEntries(genericDictionary).OrderBy(…).ToDictionary(…); 

(出於某種原因,我沒有調查此外,使用genericDictionary.Cast<DictionaryEntry>()而不是輔助方法不適用於我,但這可能是一個單音怪癖。)

+0

但是你不能對一個'DictionaryEntry'序列進行排序 - 'Key'和'Value'都是'object'類型,所以你回到了原點。 – Jon 2013-02-23 21:33:30

+0

@Jon不,不是真的。如果你知道這就是你將要得到的,你可以將'Key'或'Value'轉換爲'IComparable'。你可以有一個與'PropertyDescriptor'關聯的'IComparer',你知道這個''IComparer''''''''''將會與那個屬性一起工作。 (這些都不是類型安全的,但是如果你正在使用PropertyDescriptors而不是使用Expression來描述屬性,那麼不能真正實現類型安全。)無論如何'OrderBy'實際上對比較鍵類型放置了任何約束,所以它肯定會編譯。 – millimoose 2013-02-23 21:37:52

+1

它的工作原理!簡單而智能的代碼。令人驚歎的答案。 – Larry 2013-02-23 21:41:04