У меня есть Словарь объектов, определенных таким образом -

Dictionary<string, MyObject> myObjectDictionary 

Я хотел бы получать элементы из Словаря на основе индекса и количества элементов. Я пытаюсь использовать Skip и Take. Но для этого нужно переделать его обратно на 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  
8
A Bogus 8 Янв 2014 в 01:00

2 ответа

Лучший ответ

Что ж, вы можете создать новый словарь:

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 собственный компаратор.

19
Jon Skeet 7 Янв 2014 в 21:12

Результатом операции Skip / Take не будет IDictionary<string, MyObject>, это будет IEnumerable<KeyValuePair<string, MyObject>>.

Если вы хотите преобразовать это обратно в словарь, попробуйте вызвать ToDictionary:

var myNewObjectDictionary = mySmallerObjectDictionary.ToDictionary(p => p.Key, p => p.Value); 
2
p.s.w.g 7 Янв 2014 в 21:03