Possible Duplicate:
How do I enumerate an enum?
I don't know if it is possible to do what I want to do, but I think why not.
I have example enum:
public enum Animals { Cat, Dog, ... }
What I want to do is to iterate on this enum. I want it work like that:
foreach( var type in Animals ) { Console.WriteLine( type.toString() ); }
and the output will be:
Cat Dog
Is it possible? I don't want to put every item to an array, and then iterate, I want to iterate directly on this enum.
CA1069: Enums should not have duplicate values.
Using for loopYou can retrieve the contents of an enum using the values() method. This method returns an array containing all the values. Once you obtain the array you can iterate it using the for loop.
Of course, it's also possible to loop over the keys of a string enum, using Object. keys().
Enums don't have methods for iteration, like forEach() or iterator(). Instead, we can use the array of the Enum values returned by the values() method.
EDIT: Note that throughout this answer I've renamed Animals
to Animal
. According to .NET conventions, only flags-based enums should have a plural name.
You can use Enum.GetValues()
:
foreach (var type in (Animal[]) Enum.GetValues(typeof(Animal)) { Console.WriteLine(type.toString()); }
As noted in Dan's comment, if you use explicit typing in your foreach
loop, you don't need to cast:
foreach (Animal type in Enum.GetValues(typeof(Animal)) { Console.WriteLine(type.toString()); }
But now you won't spot errors as early as you could. For example:
foreach (Animal type in Enum.GetValues(typeof(SomeEmptyEnum)) { Console.WriteLine(type.toString()); }
Where SomeEmptyEnum
is (obviously) an empty enum type. Here GetValues
will return an empty array of type SomeEmptyEnum[]
. The code above will only check that each member of the returned array is of the right type, so you won't spot the problem. Obviously this is unlikely to happen in real life, but it demonstrates the sort of code smell which leads me to cast the result instead - basically I far prefer dealing with strongly-typed collections.
Alternatively, for a somewhat more typesafe approach, you can use my Unconstrained Melody library:
foreach (var type in Enums.GetValues<Animal>()) { Console.WriteLine(type.ToString()); }
Here my Enums.GetValues<T>()
returns an IList<T>
, which means:
Enum.GetValues()
It's also got a generic constraint forcing T
to be an enum type, so you can't accidentally call it with a non-enum type, unlike Enum.GetValues()
...
Enum.GetValues is your friend.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With