将IOrderedEnumerable <KeyValuePair <string,int >>转换为Dictionary <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 。 我尝试了几个我在网上find的半相关的例子,并把它放在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>)'有一些无效的参数

您正在指定不正确的通用参数。 你说TSource是string,实际上它是一个KeyValuePair。

这是正确的:

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

短版本是:

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

我相信将两者结合在一起的最简洁的方法是:对字典进行sorting并将其转换回字典:

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

这个问题太老了,但还是想回答一下参考:

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