2010-06-17 1 views
35

Я следовал answer to another question, и я получил:Преобразование 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>>' does not contain a definition for 'ToDictionary' and the best extension method overload 'System.Linq.Enumerable.ToDictionary<TSource,TKey>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TKey>)' has some invalid arguments

ответ

47

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

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

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

с короткой версии бытия:

sortedDict.ToDictionary(pair => pair.Key, pair => pair.Value); 
+0

Большое спасибо за вашу разработку! Итак, в C#, 'pair => pair.Key' имеет тип' Func'? Как вы объявляете один из них? (Так что можно было бы сделать sortedDict.ToDictionary (funcKey, funcVal);??) – Kache

+3

На самом деле, я бы предложил вам не использовать синтаксис C# LINQ, потому что он скрывает от вас, какие методы вы действительно называете, и выглядит чужим для C# язык. Я никогда не использую его, потому что считаю его уродливым. Ваш образец может быть записан на C# без linq следующим образом: 'sortedDict = itemCounter.OrderByDescending (entry => entry.Value)'. Не больше, не так ли? – Rotsor

+2

Я не вижу метод 'OrderByDescending' для словаря. – Kache

8

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

itemCounter = itemCounter.OrderBy(i => i.Value).ToDictionary(i => i.Key, i => i.Value); 
0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^