2014-01-07 115 views
6

我有這樣定義的對象的詞典 -鑄造結果,並採取

Dictionary<string, MyObject> myObjectDictionary 

我想抓住基於項目的索引和計數的字典中的項目。我正在嘗試使用SkipTake。但是這需要將其重新改寫爲Dictionary<string, MyObject>。如何才能做到這一點?有沒有不同的方式我應該這樣做?

這裏是我的代碼,並嘗試失敗重鑄 -

Dictionary<string, MyObject> myObjectDictionary = FillMyObjectDictionary(); 

var mySmallerObjectDictionary = myObjectDictionary.Skip(startNumber).Take(count); 

//THE FOLLOWING DOES NOT WORK 
Dictionary<string, MyObject> myNewObjectDictionary = (Dictionary<string, MyObject>)mySmallerObjectDictionary 
+5

您知道「mySmallerObjectDictionary」的內容將是不確定的嗎?索引和字典不會混合,因爲Dictionary(或任何散列表結構)的枚舉順序是未定義的。不要依賴插入順序與枚舉順序相同。如果事情按預期工作,這只是巧合。 – spender

回答

15

好了,你可以創建一個新的字典:

Dictionary<string, MyObject> myNewObjectDictionary = 
    myObjectDictionary.Skip(startNumber) 
         .Take(count) 
         .ToDictionary(pair => pair.Key, pair => pair.Value); 

但是:

  • 你不應該依賴字典的順序。目前尚不清楚您希望跳過哪些項目。考慮在Skip之前使用OrderBy。例如:

    Dictionary<string, MyObject> myNewObjectDictionary = 
        myObjectDictionary.OrderBy(pair => pair.Key) 
             .Skip(startNumber) 
             .Take(count) 
             .ToDictionary(pair => pair.Key, pair => pair.Value); 
    
  • 這並沒有保留任何自定義相等比較,這是在原來的字典。不幸的是,它並沒有暴露在任何地方,所以你只需要知道FillMyObjectDictionary是否使用自定義比較器。

+1

+10「這不保留原始字典中的任何自定義相等比較器」 –

2

Skip/Take操作的結果將不會是一個IDictionary<string, MyObject>,這將是一個IEnumerable<KeyValuePair<string, MyObject>>

如果要轉換這回一本字典,嘗試調用ToDictionary

var myNewObjectDictionary = mySmallerObjectDictionary.ToDictionary(p => p.Key, p => p.Value);