Преобразовать IOrderedEnumerable <KeyValuePair <string, int >> в словарь <string, int> - PullRequest
37 голосов
/ 18 июня 2010

Я следил за ответом на другой вопрос и получил:

// 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>)' имеет недопустимые аргументы

Ответы [ 3 ]

52 голосов
/ 18 июня 2010

Вы указываете неверные общие аргументы.Вы говорите, что TSource является строкой, когда на самом деле это KeyValuePair.

Это правильно:

sortedDict.ToDictionary<KeyValuePair<string, int>, string, int>(pair => pair.Key, pair => pair.Value);

с короткой версией:

sortedDict.ToDictionary(pair => pair.Key, pair => pair.Value);
9 голосов
/ 22 декабря 2010

Я считаю, что самый простой способ сделать оба вместе: сортировка словаря и преобразование его обратно в словарь будет:

itemCounter = itemCounter.OrderBy(i => i.Value).ToDictionary(i => i.Key, i => i.Value);
0 голосов
/ 25 июля 2016

Вопрос слишком старый, но все же хотел бы дать ответ для справки:

itemCounter = itemCounter.Take(maxAllowed).OrderByDescending(i => i.Value).ToDictionary(i => i.Key, i => i.Value);
...