You can change default values of enum elements during declaration (if necessary).
There are two ways to convert an Enum to String in Java, first by using the name() method of Enum which is an implicit method and available to all Enum, and second by using toString() method.
Enum Class MethodsReturns true one or more bit fields are set in the current instance. Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object. Returns the string representation of the value of this instance.
Yes. In C enum types are just int s under the covers. Typecast them to whatever you want. enums are not always ints in C.
This will return an IEnumerable<SomeEnum>
of all the values of an Enum.
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();
If you want that to be a List<SomeEnum>
, just add .ToList()
after .Cast<SomeEnum>()
.
To use the Cast function on an Array you need to have the System.Linq
in your using section.
Much easier way:
Enum.GetValues(typeof(SomeEnum))
.Cast<SomeEnum>()
.Select(v => v.ToString())
.ToList();
The short answer is, use:
(SomeEnum[])Enum.GetValues(typeof(SomeEnum))
If you need that for a local variable, it's var allSomeEnumValues = (SomeEnum[])Enum.GetValues(typeof(SomeEnum));
.
Why is the syntax like this?!
The static
method GetValues
was introduced back in the old .NET 1.0 days. It returns a one-dimensional array of runtime type SomeEnum[]
. But since it's a non-generic method (generics was not introduced until .NET 2.0), it can't declare its return type (compile-time return type) as such.
.NET arrays do have a kind of covariance, but because SomeEnum
will be a value type, and because array type covariance does not work with value types, they couldn't even declare the return type as an object[]
or Enum[]
. (This is different from e.g. this overload of GetCustomAttributes
from .NET 1.0 which has compile-time return type object[]
but actually returns an array of type SomeAttribute[]
where SomeAttribute
is necessarily a reference type.)
Because of this, the .NET 1.0 method had to declare its return type as System.Array
. But I guarantee you it is a SomeEnum[]
.
Everytime you call GetValues
again with the same enum type, it will have to allocate a new array and copy the values into the new array. That's because arrays might be written to (modified) by the "consumer" of the method, so they have to make a new array to be sure the values are unchanged. .NET 1.0 didn't have good read-only collections.
If you need the list of all values many different places, consider calling GetValues
just once and cache the result in read-only wrapper, for example like this:
public static readonly ReadOnlyCollection<SomeEnum> AllSomeEnumValues
= Array.AsReadOnly((SomeEnum[])Enum.GetValues(typeof(SomeEnum)));
Then you can use AllSomeEnumValues
many times, and the same collection can be safely reused.
Why is it bad to use .Cast<SomeEnum>()
?
A lot of other answers use .Cast<SomeEnum>()
. The problem with this is that it uses the non-generic IEnumerable
implementation of the Array
class. This should have involved boxing each of the values into an System.Object
box, and then using the Cast<>
method to unbox all those values again. Luckily the .Cast<>
method seems to check the runtime type of its IEnumerable
parameter (the this
parameter) before it starts iterating through the collection, so it isn't that bad after all. It turns out .Cast<>
lets the same array instance through.
If you follow it by .ToArray()
or .ToList()
, as in:
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList() // DON'T do this
you have another problem: You create a new collection (array) when you call GetValues
and then create yet a new collection (List<>
) with the .ToList()
call. So that's one (extra) redundant allocation of an entire collection to hold the values.
Update: Since .NET 5.0 (from 2020), the above information is obsolete; there is finally a generic method (generics having been introduced with .NET Framework 2.0 from the year 2005), so now you should simply use:
Enum.GetValues<SomeEnum>()
whose return parameter is strongly typed (as SomeEnum[]
).
Here is the way I love, using LINQ:
public class EnumModel
{
public int Value { get; set; }
public string Name { get; set; }
}
public enum MyEnum
{
Name1=1,
Name2=2,
Name3=3
}
public class Test
{
List<EnumModel> enums = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Select(c => new EnumModel() { Value = (int)c, Name = c.ToString() }).ToList();
// A list of Names only, does away with the need of EnumModel
List<string> MyNames = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Select(c => c.ToString()).ToList();
// A list of Values only, does away with the need of EnumModel
List<int> myValues = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Select(c => (int)c).ToList();
// A dictionnary of <string,int>
Dictionary<string,int> myDic = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).ToDictionary(k => k.ToString(), v => (int)v);
}
Hope it helps
List <SomeEnum> theList = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList();
very simple answer
Here is a property I use in one of my applications
public List<string> OperationModes
{
get
{
return Enum.GetNames(typeof(SomeENUM)).ToList();
}
}
I've always used to get a list of enum
values like this:
Array list = Enum.GetValues(typeof (SomeEnum));
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