如何在C#中遍历所有枚举值:从新手到专家
\n\n想象一下这个场景:你正在用C#编写一个游戏,并且有一个名为Difficulty的枚举,包含难度级别:Easy, Normal, Hard, Insane。你需要将它们全部显示在选择菜单中,或者为配置器创建一个下拉列表。该怎么做?手动编写一个字符串数组?如果明天添加了一个新的难度级别怎么办?你将不得不修改代码中的三个地方。
幸运的是,C#中有一个优雅的解决方案。问题"How to loop through all enum values in C#?"是Stack Overflow上最热门的问题之一(有数十万次浏览)。今天我们将全面解析它。您将学习到不止一种,而是4种遍历枚举值的方法,了解何时使用哪种方法,并获得可以直接复制到项目中的现成代码。
\n\n开始吧!
\n\n\n\n
C#中的枚举是什么以及为什么要遍历它?
\n\n枚举(Enum)是一组命名常量。您无需记住0 = Easy, 1 = Normal, 2 = Hard,只需编写Difficulty.Easy。代码变得可读且安全。
但是,当项目中有10-20个枚举值时,迟早会遇到一个问题:获取所有枚举值。例如:
\n- \n
- 填充UI中的ComboBox或Dropdown。 \n
- 为所有选项创建测试数据。 \n
- 为每个值应用属性。 \n
- 比较两个枚举集。 \n
与其编写:
\nstring[] names = { "Easy", "Normal", "Hard", "Insane" };\n\n……我们使用反射和.NET内置方法。这灵活、可扩展,并且不需要手动更新。
\n\n\n\n
方法1:经典方法——Enum.GetValues(最流行)
\n\n这是您在Stack Overflow上找到的获得最多投票的答案。方法Enum.GetValues(typeof(YourEnum))返回特定枚举的所有值的数组。
代码示例:
\nusing System;\n\npublic enum Difficulty\n{\n Easy,\n Normal,\n Hard,\n Insane\n}\n\nclass Program\n{\n static void Main()\n {\n Console.WriteLine("所有难度级别:");\n \n // 获取枚举值的数组\n Difficulty[] allDifficulties = (Difficulty[])Enum.GetValues(typeof(Difficulty));\n \n foreach (Difficulty level in allDifficulties)\n {\n Console.WriteLine($"级别:{level} (数值:{(int)level})");\n }\n }\n}\n\n控制台输出:
\n所有难度级别:\n级别:Easy (数值:0)\n级别:Normal (数值:1)\n级别:Hard (数值:2)\n级别:Insane (数值:3)\n\n重要提示:Enum.GetValues返回一个类型为Array的数组,因此需要显式地将其转换为您的枚举类型。从.NET 5开始,出现了泛型版本:Enum.GetValues<Difficulty>(),使用起来更方便一些。
// .NET 5+ \nDifficulty[] allDifficulties = Enum.GetValues<Difficulty>();\nforeach (var level in allDifficulties)\n{\n Console.WriteLine(level);\n}\n\n\n\n
方法2:通过Enum.GetNames获取名称
\n\n有时您需要的不是值本身,而是它们的字符串名称(例如,用于UI)。为此,有Enum.GetNames方法。它返回一个字符串数组。
示例:
\nstring[] names = Enum.GetNames(typeof(Difficulty));\nConsole.WriteLine("难度级别名称:");\nforeach (string name in names)\n{\n Console.WriteLine(name);\n}\n\n输出:
\n难度级别名称:\nEasy\nNormal\nHard\nInsane\n\n何时使用?当您需要的是字符串(例如,用于界面显示或日志记录)而不是枚举常量本身时。