如何在C#中遍历所有枚举值?[复制]

How to loop through all enum values in C#? [duplicate]

提问人:divinci 提问时间:6/10/2009 最后编辑:Cœurdivinci 更新时间:3/10/2019 访问量:957342

问:

这个问题在这里已经有答案了:
11年前关闭。

这个问题在这里已经有答案了:
如何在 C# 中枚举枚举枚举? 26 个回答

public enum Foos
{
    A,
    B,
    C
}

有没有办法遍历 的可能值?Foos

基本上?

foreach(Foo in Foos)
C# .NET 枚举语言 功能

评论


答:

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 中,您现在可以使用 (以及 和 ) 作为泛型约束。Enumunmanageddelegate
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
}