Преобразуйте IOrderedEnumerable <KeyValuePair <string, int >> в словарь <string, int>
Я отвечал на ответ на другой вопрос, и я получил:
// itemCounter is a Dictionary<string, int>, and I only want to keep
// key/value pairs with the top maxAllowed values
if (itemCounter.Count > maxAllowed) {
IEnumerable<KeyValuePair<string, int>> sortedDict =
from entry in itemCounter orderby entry.Value descending select entry;
sortedDict = sortedDict.Take(maxAllowed);
itemCounter = sortedDict.ToDictionary<string, int>(/* what do I do here? */);
}
Visual Studio запрашивает параметр Func<string, int> keySelector
. Я пробовал следовать нескольким полу-релевантным примерам, которые я нашел в Интернете, и помещен в k => k.Key
, но это дает ошибку компилятора:
'System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,int>>'
не содержит определения для "ToDictionary" и лучшего перегрузка метода расширения 'System.Linq.Enumerable.ToDictionary<TSource,TKey>(System.Collections.Generic.IEnumerable<TSource>,
System.Func<TSource,TKey>)'
имеет некоторые недопустимые аргументы
Ответы
Ответ 1
Вы указываете неправильные общие аргументы. Вы говорите, что TSource является строкой, когда на самом деле это KeyValuePair.
Это верно:
sortedDict.ToDictionary<KeyValuePair<string, int>, string, int>(pair => pair.Key, pair => pair.Value);
с коротким вариантом:
sortedDict.ToDictionary(pair => pair.Key, pair => pair.Value);
Ответ 2
Я считаю, что самый чистый способ сделать оба вместе: сортировка словаря и преобразование его обратно в словарь:
itemCounter = itemCounter.OrderBy(i => i.Value).ToDictionary(i => i.Key, i => i.Value);
Ответ 3
Вопрос слишком стар, но все же хотел бы дать ответ для справки:
itemCounter = itemCounter.Take(maxAllowed).OrderByDescending(i => i.Value).ToDictionary(i => i.Key, i => i.Value);