Skip and Take后对象Dictionary的转换结果

时间:2014-01-07 21:00:23

标签: c# linq

我有一个像这样定义的对象词典 -

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  

2 个答案:

答案 0 :(得分:18)

好吧,你可以创建一个新词典:

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

然而:

  • 您不应该依赖字典的排序。目前尚不清楚您希望跳过哪些项目。考虑在OrderBy之前使用Skip。例如:

    Dictionary<string, MyObject> myNewObjectDictionary =
        myObjectDictionary.OrderBy(pair => pair.Key)
                          .Skip(startNumber)
                          .Take(count)
                          .ToDictionary(pair => pair.Key, pair => pair.Value);
    
  • 保留原始字典中的任何自定义相等比较器。不幸的是,它没有暴露在任何地方,因此您只需要知道FillMyObjectDictionary是否使用自定义比较器。

答案 1 :(得分:2)

Skip / Take操作的结果不是IDictionary<string, MyObject>,而是IEnumerable<KeyValuePair<string, MyObject>>

如果您想将其转换回字典,请尝试拨打ToDictionary

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