将 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&lt;string, int&gt; keySelector。我尝试按照我在网上找到的一些半相关示例并输入k =&gt; k.Key,但这会产生编译器错误:

'System.Collections.Generic.IEnumerable&lt;System.Collections.Generic.KeyValuePair&lt;string,int&gt;&gt;' 不包含“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 =&gt; pair.Key 的类型是 Func?你如何声明其中之一? (这样可以sortedDict.ToDictionary(funcKey, funcVal);?) 实际上,我建议您不要使用 C# LINQ 语法,因为它对您隐藏了您真正调用的方法,并且对于 C# 语言看起来很陌生。我从不使用它,因为我认为它很丑。您的示例可以在没有 linq 的情况下用 C# 编写,如下所示:sortedDict = itemCounter.OrderByDescending(entry =&gt; entry.Value)。不会再长了吧? 我没有看到 OrderByDescendingDictionary 方法。【参考方案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”

通过 API 从 TFS 检索数据驱动测试的结果

将 Map<K, List<V>> 转换为 Map<K, V> 其中 V 有 2 个对象列表

各种技巧摘抄

大多数时候 OCR 将 < 识别为 K。有没有办法解决这个问题?