将 IOrderedEnumerable<KeyValuePair<string, int>> 转换为 Dictionary<string, int>
Posted
技术标签:
【中文标题】将 IOrderedEnumerable<KeyValuePair<string, int>> 转换为 Dictionary<string, int>【英文标题】:Convert an IOrderedEnumerable<KeyValuePair<string, int>> into a Dictionary<string, int> 【发布时间】:2011-03-05 05:12:16 【问题描述】:我关注了answer to another question,我得到了:
// 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);
【讨论】:
非常感谢您的详细说明!所以在 C# 中,pair => pair.Key
的类型是 Func
?你如何声明其中之一? (这样可以sortedDict.ToDictionary(funcKey, funcVal);
?)
实际上,我建议您不要使用 C# LINQ 语法,因为它对您隐藏了您真正调用的方法,并且对于 C# 语言看起来很陌生。我从不使用它,因为我认为它很丑。您的示例可以在没有 linq 的情况下用 C# 编写,如下所示:sortedDict = itemCounter.OrderByDescending(entry => entry.Value)
。不会再长了吧?
我没有看到 OrderByDescending
的 Dictionary
方法。【参考方案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);
【讨论】:
这不会返回预期的结果,因为您在完成排序之前正在执行Take
以上是关于将 IOrderedEnumerable<KeyValuePair<string, int>> 转换为 Dictionary<string, int>的主要内容,如果未能解决你的问题,请参考以下文章
System.Collections.Generic.List中.OrderBy的使用问题??
Resharper报“Possible multiple enumeration of IEnumerable”