C#中按值对字典排序:完整指南与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么按值对字典排序让人头疼(以及如何解决)

\n\n

您是否遇到过这种情况:有一个包含数十条记录的Dictionary<string, int>,需要按流行度降序输出?例如,文本中最常见的单词列表或销量前十的产品。看似简单的任务,但C#中的标准Dictionary以任意顺序存储数据。在Stack Overflow上,问题"How do you sort a dictionary by value?"获得了数千次浏览——这并非偶然。

\n\n

在本教程中,我们将介绍在C#中按值对Dictionary进行排序的所有合法方法:从简单的LINQ技巧到创建自定义有序字典。您将了解如何选择最适合性能和代码可读性的方法。

\n\n

为什么Dictionary本身不会排序?

\n\n

在深入代码之前,让我们先了解Dictionary<TKey, TValue>的本质。这种数据类型是一个哈希表。它针对按键快速查找进行了优化,而不是按特定顺序存储元素。当您添加元素时,它会根据键的哈希值进入一个“桶”。不会进行任何排序。

\n\n

如果您需要排序后的输出——就必须手动干预。好消息是:C#提供了几种优雅的解决方案。

\n\n

方法1:LINQ——最流行的方法(如同Stack Overflow上的答案)

\n\n

最简单且最常用的方法是使用LINQ和OrderBy或OrderByDescending方法。当您需要一次性对数据进行排序以进行显示或导出时,此方法非常理想。

\n\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nvar fruits = new Dictionary<string, int>\n{\n    {"apple", 5},\n    {"banana", 3},\n    {"orange", 8},\n    {"grape", 1}\n};\n\n// 按值升序排序\nvar sortedAsc = fruits.OrderBy(pair => pair.Value);\n\n// 按值降序排序\nvar sortedDesc = fruits.OrderByDescending(pair => pair.Value);\n\nConsole.WriteLine("升序:");\nforeach (var item in sortedAsc)\n{\n    Console.WriteLine($"{item.Key}: {item.Value}");\n}\n\nConsole.WriteLine("\\n降序:");\nforeach (var item in sortedDesc)\n{\n    Console.WriteLine($"{item.Key}: {item.Value}");\n}
\n\n

结果:

\n
升序:\ngrape: 1\nbanana: 3\napple: 5\norange: 8\n\n降序:\norange: 8\napple: 5\nbanana: 3\ngrape: 1
\n\n

它是如何工作的?

\n

OrderBy返回一个IOrderedEnumerable<KeyValuePair<string, int>>——一个“惰性”排序的序列(仅在首次遍历时排序)。这不是一个新的字典,而是一个投影。如果您需要保存结果,请使用.ToDictionary()将其转换回字典。

\n\n

重要提示: ToDictionary会创建一个普通的Dictionary,它再次不保证顺序。如果顺序至关重要——请使用SortedDictionary或元组列表。

\n\n

方法2:SortedDictionary——当需要持续保持顺序时

\n\n

如果您计划多次访问排序后的数据,最好使用SortedDictionary。该类会自动维护按键排序。但我们需要的是按值排序!

\n\n

技巧:我们不能直接让SortedDictionary按值排序。但我们可以使用带有自定义比较器的SortedDictionary,或者更简单地说,创建一个辅助类。

\n\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nvar fruits = new Dictionary<string, int>\n{\n    {"apple", 5},\n    {"banana", 3},\n    {"orange", 8},\n    {"grape"                

博客

书籍推荐