提问人:divinci 提问时间:6/10/2009 最后编辑:Cœurdivinci 更新时间:3/10/2019 访问量:957342
如何在C#中遍历所有枚举值?[复制]
How to loop through all enum values in C#? [duplicate]
问:
这个问题在这里已经有答案了:
如何在 C# 中枚举枚举枚举? 26 个回答
public enum Foos
{
A,
B,
C
}
有没有办法遍历 的可能值?Foos
基本上?
foreach(Foo in Foos)
答:
929赞
SLaks
6/10/2009
#1
foreach(Foos foo in Enum.GetValues(typeof(Foos)))
评论
24赞
Robert Patterson
4/24/2016
这是一个很好的解决方案。通过使用“Foos”而不是“var”,类型推断系统能够使用返回正确对象类型的 GetValues 版本。好!
8赞
chtenb
6/16/2017
@RobertPatterson 通过使用,什么都没有被神奇地推断出来。这是一个明确的演员阵容。Foos
7赞
Sinjai
8/22/2017
@daveD我想人们可以自己处理编写 foreach 块。
2赞
silvalli
6/12/2019
2019 年,@RobertPatterson var 在这里工作。
2467赞
JaredPar
6/10/2009
#2
是的,您可以使用 GetValue s
方法:
var values = Enum.GetValues(typeof(Foos));
或键入版本:
var values = Enum.GetValues(typeof(Foos)).Cast<Foos>();
很久以前,我就在我的私人库中添加了一个辅助函数,用于这样的场合:
public static class EnumUtil {
public static IEnumerable<T> GetValues<T>() {
return Enum.GetValues(typeof(T)).Cast<T>();
}
}
用法:
var values = EnumUtil.GetValues<Foos>();
评论
217赞
Şafak Gür
11/22/2012
您可以直接转换数组:(T[])Enum.GetValues(typeof(T))
51赞
Jeppe Stig Nielsen
4/16/2013
@ŞafakGür 注释的好处是 (1) 您不必经历额外的迭代器 (),并且 (2) 您不需要将所有值装箱并再次拆箱。Şafak 的强制转换将保持有效,只要他们不将返回的数组类型更改为其他类型(如 )。但是我们可以完全确定它们不会,因为(a)它会失去性能,(b)已经有数百万条代码线使用Şafak的强制转换,而且它们都会因运行时异常而中断。.Cast<Foos>
object[]
6赞
Jon Coombs
3/25/2014
当然,有多少枚举将包含十几个或两个以上的值?我想在大多数情况下,装箱/拆箱的打击可以忽略不计,因此最干净的解决方案是最高优先级。
15赞
Şafak Gür
7/31/2014
@JCoombs我觉得这很干净:.但是,是的,在常用中,性能差异可以忽略不计。我只是不喜欢在我已经有一个可迭代(可枚举)对象要返回时创建迭代器的想法。public static IReadOnlyList<T> GetValues<T>() { return (T[])Enum.GetValues(typeof(T)); }
13赞
JAB
9/10/2014
不幸的是,这并不能回答提出的问题。问题是如何遍历枚举的值。SLaks回答了这个问题。
13赞
Pablo Santa Cruz
6/10/2009
#3
是的。在 System.Enum
类中使用 GetValues()
方法。
评论
0赞
stoj
7/17/2022
如果您使用的是 .net5,它带有开箱即用的通用版本。即,根据上述大多数示例,不再需要 typeof() 和强制转换。stackoverflow.com/a/65103244/227110
151赞
Inisheer
6/10/2009
#4
foreach (EMyEnum val in Enum.GetValues(typeof(EMyEnum)))
{
Console.WriteLine(val);
}
感谢 Jon Skeet:http://bytes.com/groups/net-c/266447-how-loop-each-items-enum
69赞
adrianbanks
6/10/2009
#5
foreach (Foos foo in Enum.GetValues(typeof(Foos)))
{
...
}
评论
0赞
R.Akhlaghi
7/19/2023
重复回答亲爱的@arian
13赞
Vasu Balakrishnan
6/10/2009
#6
Enum.GetValues(typeof(Foos))
44赞
Neil Barnwell
6/10/2009
#7
更新
了一段时间,我看到一条评论让我回到了我的旧答案,我想我现在会以不同的方式做。这些天我会写:
private static IEnumerable<T> GetEnumValues<T>()
{
// Can't use type constraints on value types, so have to do check like this
if (typeof(T).BaseType != typeof(Enum))
{
throw new ArgumentException("T must be of type System.Enum");
}
return Enum.GetValues(typeof(T)).Cast<T>();
}
评论
2赞
Sebastian
9/22/2013
为什么使用 LINQ “更正确”?请c.f. @SafakGür,此版本的开销 IMO 较小。You can cast the array directly: (T[])Enum.GetValues(typeof(T))
10赞
Saboor Awan
4/3/2014
让它变得简单 GetEnumValues<T>() 其中 T : 枚举
2赞
Carlos Muñoz
3/10/2016
@SaboorAwan不能将 System.Enum 用作类型参数约束。编译器 说:Constraint cannot be special class 'Enum'
0赞
Neil Barnwell
3/17/2016
是的,这就是为什么我在我的实现中有注释和类型检查的东西;我已经想到了。:)
7赞
WBuck
5/23/2018
快速笔记。在 C# 7.3 中,您现在可以使用 (以及 和 ) 作为泛型约束。Enum
unmanaged
delegate
39赞
dbones
6/10/2009
#8
static void Main(string[] args)
{
foreach (int value in Enum.GetValues(typeof(DaysOfWeek)))
{
Console.WriteLine(((DaysOfWeek)value).ToString());
}
foreach (string value in Enum.GetNames(typeof(DaysOfWeek)))
{
Console.WriteLine(value);
}
Console.ReadLine();
}
public enum DaysOfWeek
{
monday,
tuesday,
wednesday
}
上一个:在 C 中调用基构造函数#
评论