4012

How can you enumerate an enum in C#?

E.g. the following code does not compile:

public enum Suit
{
    Spades,
    Hearts,
    Clubs,
    Diamonds
}

public void EnumerateAllSuitsDemoMethod()
{
    foreach (Suit suit in Suit)
    {
        DoSomething(suit);
    }
}

And it gives the following compile-time error:

'Suit' is a 'type' but is used like a 'variable'

It fails on the Suit keyword, the second one.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Ian Boyd
  • 220,884
  • 228
  • 805
  • 1,125
  • 18
    See also ... http://stackoverflow.com/questions/972307/can-you-loop-through-all-enum-values-c – SteveC Aug 04 '09 at 14:10
  • 2
    You may want to check out [the ins and outs of C# enums](https://github.com/steaks/codeducky/blob/master/blogs/enums.md), which discusses this as well as other useful enum tidbits – ChaseMedallion May 14 '18 at 12:53

32 Answers32

4901
foreach (Suit suit in (Suit[]) Enum.GetValues(typeof(Suit)))
{
}

Note: The cast to (Suit[]) is not strictly necessary, but it does make the code 0.5 ns faster.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
jop
  • 77,529
  • 10
  • 52
  • 52
  • 103
    This doesn't work if you have duplicate values in the enumerator list. – Jessy Jun 17 '12 at 03:50
  • 2
    @Jessy if you need all the names (including the ones with duplicate values), maybe try Enum.GetNames in conjunction with Enum.Parse. It's going to be a little slow though, I recommend doing it once during initialization (or the first time it's needed) and caching the results into an array. – BrainSlugs83 Aug 13 '13 at 02:05
  • 10
    I just want to point out that this, unfortunately won't work in silverlight, since the silverlight library don't comprise `enum.GetValues`. You have to use reflection in this case. – Giacomo Tagliabue Oct 17 '13 at 05:50
  • 159
    @Jessy this *does* work in case of duplicate situations like `enum E {A = 0, B = 0}`. `Enum.GetValues` results in two values being returned, though they are the same. `E.A == E.B` is true, so there is not distinction. If you want individual names, then you should look for `Enum.GetNames`. – nawfal Nov 07 '13 at 09:25
  • 15
    Then if you have duplicates/synonyms in your enum, and you want the other behavior, you can use Linq's `Distinct` extension (since .NET 3.5), so `foreach (var suit in ((Suit[])Enum.GetValues(typeof(Suit))).Distinct()) { }`. – Jeppe Stig Nielsen Jun 12 '14 at 08:46
  • 50
    I made the mistake of trying to use `var` for the type. The compiler will make the variable an `Object` instead of the enum. List the enum type explicitly. – jpmc26 Jan 08 '16 at 22:57
  • 1
    When I add the cast `(Suit[])`, my code run 1,6 times faster. Try it yourself. I tested an empty foreach with StopWatch. `for (int i = 0; i < 1000000; i++) foreach (Suit suit in (Suit[])Enum.GetValues(typeof(Suit))) {}` – marbel82 Jun 09 '17 at 12:14
  • 1
    @BartoszKP I ran your code and I found a mistake ([answered here](https://gist.github.com/bartoszkp/9e059c3edccc07a5e588#gistcomment-2625454)). I improved [my tests using the BenchmarkDotNet benchmark.](https://gist.github.com/marbel82/5bfa2010b534c681a3c618a98719c862) – marbel82 Jun 20 '18 at 21:31
  • 1
    @marbel82 Well done, thanks! This really qualifies as a separate Q&A (you can self-answer). Thanks for letting me learn something, this is very interesting indeed. I've reverted my edit as it looks that it's true - the version with the cast consistently produces faster code. Although IMHO this still qualifies as a micro-optimization that will make sense only in very specific cases. – BartoszKP Jun 21 '18 at 09:05
  • Well, I liked the fact that you pointed out that the `Suit[]` makes the code **0.5 ns faster** :) – Momoro Feb 14 '20 at 08:44
758

It looks to me like you really want to print out the names of each enum, rather than the values. In which case Enum.GetNames() seems to be the right approach.

public enum Suits
{
    Spades,
    Hearts,
    Clubs,
    Diamonds,
    NumSuits
}

public void PrintAllSuits()
{
    foreach (string name in Enum.GetNames(typeof(Suits)))
    {
        System.Console.WriteLine(name);
    }
}

By the way, incrementing the value is not a good way to enumerate the values of an enum. You should do this instead.

I would use Enum.GetValues(typeof(Suit)) instead.

public enum Suits
{
    Spades,
    Hearts,
    Clubs,
    Diamonds,
    NumSuits
}

public void PrintAllSuits()
{
    foreach (var suit in Enum.GetValues(typeof(Suits)))
    {
        System.Console.WriteLine(suit.ToString());
    }
}
metalmad
  • 49
  • 1
  • 8
Haacked
  • 54,591
  • 14
  • 86
  • 110
  • 2
    VB Syntax here: [link](https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/constants-enums/how-to-iterate-through-an-enumeration) – AndruWitta Sep 09 '18 at 02:11
  • 1
    I took your version with a small following changes from my side: `Enum.GetValues(typeof(Suits)).OfType().ToArray()`. In that case I can iterate array of `Suits` enum items, not strings. – Barabas Jun 24 '19 at 12:57
  • @Barabas why not just do `Suits suit in Enum.GetValues(typeof(Suits))` ? – themadking Feb 04 '20 at 22:15
  • @themadking oh, man! of course, using exact type looks better than this monstrous piece of _sh..._ code! – Barabas Feb 05 '20 at 11:41
368

I made some extensions for easy enum usage. Maybe someone can use it...

public static class EnumExtensions
{
    /// <summary>
    /// Gets all items for an enum value.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    public static IEnumerable<T> GetAllItems<T>(this Enum value)
    {
        foreach (object item in Enum.GetValues(typeof(T)))
        {
            yield return (T)item;
        }
    }

    /// <summary>
    /// Gets all items for an enum type.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    public static IEnumerable<T> GetAllItems<T>() where T : struct
    {
        foreach (object item in Enum.GetValues(typeof(T)))
        {
            yield return (T)item;
        }
    }

    /// <summary>
    /// Gets all combined items from an enum value.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    /// <example>
    /// Displays ValueA and ValueB.
    /// <code>
    /// EnumExample dummy = EnumExample.Combi;
    /// foreach (var item in dummy.GetAllSelectedItems<EnumExample>())
    /// {
    ///    Console.WriteLine(item);
    /// }
    /// </code>
    /// </example>
    public static IEnumerable<T> GetAllSelectedItems<T>(this Enum value)
    {
        int valueAsInt = Convert.ToInt32(value, CultureInfo.InvariantCulture);

        foreach (object item in Enum.GetValues(typeof(T)))
        {
            int itemAsInt = Convert.ToInt32(item, CultureInfo.InvariantCulture);

            if (itemAsInt == (valueAsInt & itemAsInt))
            {
                yield return (T)item;
            }
        }
    }

    /// <summary>
    /// Determines whether the enum value contains a specific value.
    /// </summary>
    /// <param name="value">The value.</param>
    /// <param name="request">The request.</param>
    /// <returns>
    ///     <c>true</c> if value contains the specified value; otherwise, <c>false</c>.
    /// </returns>
    /// <example>
    /// <code>
    /// EnumExample dummy = EnumExample.Combi;
    /// if (dummy.Contains<EnumExample>(EnumExample.ValueA))
    /// {
    ///     Console.WriteLine("dummy contains EnumExample.ValueA");
    /// }
    /// </code>
    /// </example>
    public static bool Contains<T>(this Enum value, T request)
    {
        int valueAsInt = Convert.ToInt32(value, CultureInfo.InvariantCulture);
        int requestAsInt = Convert.ToInt32(request, CultureInfo.InvariantCulture);

        if (requestAsInt == (valueAsInt & requestAsInt))
        {
            return true;
        }

        return false;
    }
}

The enum itself must be decorated with the FlagsAttribute:

[Flags]
public enum EnumExample
{
    ValueA = 1,
    ValueB = 2,
    ValueC = 4,
    ValueD = 8,
    Combi = ValueA | ValueB
}
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
bob
  • 6,245
  • 1
  • 28
  • 26
  • 16
    A one liner for the first extension method; it's no more lazy. return Enum.GetValues(typeof(T)).Cast(); – Leyu Jun 22 '10 at 09:29
  • 2
    Alternatively you could use OfType too: Enum.GetValues(typeof(T)).OfType(). It's too bad there is not a generic version of GetValues() then it would be even more slick. – jpierson Jan 10 '11 at 22:38
  • 3
    Maybe someone could show how to use these extensions? The compiler do not show extension methods on enum EnumExample. – Tomas Feb 12 '13 at 08:01
  • @Tomas did you put the extensions in another namespace? Did you add the correct using statement? – bob Feb 15 '13 at 11:24
  • 3
    +1 for reusable code: examples - save these extension methods in a library and reference it [Flags]public enum mytypes{name1, name2 }; List myTypeNames = mytypes.GetAllItems(); – Krishna Oct 22 '13 at 06:55
  • 1
    Starting with C# 7.3 (Visual Studio 2017 ≥ v15.7), one can use `where T: Enum` – Yahoo Serious Jul 27 '18 at 15:00
192

Some versions of the .NET framework do not support Enum.GetValues. Here's a good workaround from Ideas 2.0: Enum.GetValues in Compact Framework:

public Enum[] GetValues(Enum enumeration)
{
    FieldInfo[] fields = enumeration.GetType().GetFields(BindingFlags.Static | BindingFlags.Public);
    Enum[] enumerations = new Enum[fields.Length];

    for (var i = 0; i < fields.Length; i++)
        enumerations[i] = (Enum) fields[i].GetValue(enumeration);

    return enumerations;
}

As with any code that involves reflection, you should take steps to ensure it runs only once and results are cached.

Mikael Dúi Bolinder
  • 1,963
  • 1
  • 14
  • 34
Ekevoo
  • 2,514
  • 1
  • 21
  • 31
132

Use Cast<T>:

var suits = Enum.GetValues(typeof(Suit)).Cast<Suit>();

There you go, IEnumerable<Suit>.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
sircodesalot
  • 10,501
  • 5
  • 44
  • 78
108

I think this is more efficient than other suggestions because GetValues() is not called each time you have a loop. It is also more concise. And you get a compile-time error, not a runtime exception if Suit is not an enum.

EnumLoop<Suit>.ForEach((suit) => {
    DoSomethingWith(suit);
});

EnumLoop has this completely generic definition:

class EnumLoop<Key> where Key : struct, IConvertible {
    static readonly Key[] arr = (Key[])Enum.GetValues(typeof(Key));
    static internal void ForEach(Action<Key> act) {
        for (int i = 0; i < arr.Length; i++) {
            act(arr[i]);
        }
    }
}
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
James
  • 4,549
  • 1
  • 30
  • 39
  • 8
    Careful with using generics like this. If you try to use `EnumLoop` with some type that is not an enum, it will compile fine, but throw an exception at runtime. – svick Feb 06 '12 at 12:09
  • 8
    Thank you svick. Runtime exceptions will actually occur with the other answers on this page... except this one because I have added "where Key : struct, IConvertible" so that you get a compile time error in most cases. – James Feb 07 '12 at 12:13
  • 3
    No, GetValues() is called only once in the foreach. – Alex Blokha Jul 30 '12 at 11:25
  • 4
    James, I would discourage your class because clever is nice to write but in production code that many people will maintain and update, clever is extra work. If it makes a major saving or will be used a lot - so the savings is big and people will become familiar with it - it is worth it, but in most cases it slows down people trying to read and update the code and introduces a possible source bugs in the future. Less code is better :) less complexity is even better. – Grant M Jan 19 '15 at 04:00
  • 2
    @GrantM Why? This code is neither complex, and it's incredibly short. On top of that, writing the class once will allow even shorter iterations of code with using is as per his example. This is extremely clean, if you can't update that code, you probably can't update any of the companies code. – Dispersia May 16 '17 at 18:30
  • 2
    Starting with C# 7.3 (Visual Studio 2017 ≥ v15.7), one can use `where Key: Enum` – Yahoo Serious Jul 27 '18 at 14:48
85

You won't get Enum.GetValues() in Silverlight.

Original Blog Post by Einar Ingebrigtsen:

public class EnumHelper
{
    public static T[] GetValues<T>()
    {
        Type enumType = typeof(T);

        if (!enumType.IsEnum)
        {
            throw new ArgumentException("Type '" + enumType.Name + "' is not an enum");
        }

        List<T> values = new List<T>();

        var fields = from field in enumType.GetFields()
                     where field.IsLiteral
                     select field;

        foreach (FieldInfo field in fields)
        {
            object value = field.GetValue(enumType);
            values.Add((T)value);
        }

        return values.ToArray();
    }

    public static object[] GetValues(Type enumType)
    {
        if (!enumType.IsEnum)
        {
            throw new ArgumentException("Type '" + enumType.Name + "' is not an enum");
        }

        List<object> values = new List<object>();

        var fields = from field in enumType.GetFields()
                     where field.IsLiteral
                     select field;

        foreach (FieldInfo field in fields)
        {
            object value = field.GetValue(enumType);
            values.Add(value);
        }

        return values.ToArray();
    }
}
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Aubrey Taylor
  • 851
  • 6
  • 2
65

My solution works in .NET Compact Framework (3.5) and supports type checking at compile time:

public static List<T> GetEnumValues<T>() where T : new() {
    T valueType = new T();
    return typeof(T).GetFields()
        .Select(fieldInfo => (T)fieldInfo.GetValue(valueType))
        .Distinct()
        .ToList();
}

public static List<String> GetEnumNames<T>() {
    return typeof (T).GetFields()
        .Select(info => info.Name)
        .Distinct()
        .ToList();
}
  • If anyone knows how to get rid of the T valueType = new T(), I'd be happy to see a solution.

A call would look like this:

List<MyEnum> result = Utils.GetEnumValues<MyEnum>();
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Mallox
  • 1,374
  • 11
  • 12
  • 2
    what about using `T valueType = default(T)`? – Oliver Jul 07 '10 at 14:17
  • Great, I didn't even know that keyword. Always nice to learn something new. Thank you! Does it always return a reference to the same object, or does it create a new instance each time the default statement is called? I haven't found anything on the net about this so far, but if it creates a new instance every time, it kind of defeats the purpose I was looking for (having a one-liner ^^). – Mallox Jul 08 '10 at 06:48
  • 1
    Wouldn't this create a new instance for every iteration over the enumeration? – Mallox Jun 28 '11 at 15:04
  • 1
    -1 for "supports type checking at compile time:". What type checking? This would work for any `new()` `T`. Also, you dont need `new T()` at all, you can select just the static fields alone and do `.GetValue(null)`. See Aubrey's answer. – nawfal Jan 30 '14 at 04:47
  • Type checking at compile time refers to the return value of the function, which in this case will throw an error if you're trying to assign the enum to a list of a different type. Some of the solutions here return generics which will only fail during runtime. – Mallox Jun 22 '15 at 18:47
  • 2
    Starting with C# 7.3 (Visual Studio 2017 ≥ v15.7), one can use `where T: Enum` – Yahoo Serious Jul 27 '18 at 14:59
57

I think you can use

Enum.GetNames(Suit)
bluish
  • 23,093
  • 23
  • 110
  • 171
Tom Carr
  • 1,269
  • 7
  • 11
55
public void PrintAllSuits()
{
    foreach(string suit in Enum.GetNames(typeof(Suits)))
    {
        Console.WriteLine(suit);
    }
}
Termininja
  • 5,689
  • 12
  • 40
  • 45
Joshua Drake
  • 2,581
  • 2
  • 34
  • 53
  • 2
    That enumerates a string, don't forget to convert those things back to an enumeration value so the enumeration can be enumerated. – Ian Boyd Jun 01 '10 at 17:46
  • 1
    I see from your edit that you want to actually operate on the enums themselves, the above code addressed your original post. – Joshua Drake Jun 04 '10 at 15:22
53
foreach (Suit suit in Enum.GetValues(typeof(Suit))) { }

I've heard vague rumours that this is terifically slow. Anyone know? – Orion Edwards Oct 15 '08 at 1:31 7

I think caching the array would speed it up considerably. It looks like you're getting a new array (through reflection) every time. Rather:

Array enums = Enum.GetValues(typeof(Suit));
foreach (Suit suitEnum in enums) 
{
    DoSomething(suitEnum);
}

That's at least a little faster, ja?

Alexander Schmidt
  • 4,930
  • 4
  • 33
  • 71
lmat - Reinstate Monica
  • 6,119
  • 4
  • 44
  • 55
37

Just by combining the top answers, I threw together a very simple extension:

public static class EnumExtensions
{
    /// <summary>
    /// Gets all items for an enum value.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    public static IEnumerable<T> GetAllItems<T>(this T value) where T : Enum
    {
        return (T[])Enum.GetValues(typeof (T));
    }
}

It is clean, simple, and, by @Jeppe-Stig-Nielsen's comment, fast.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Darkside
  • 1,655
  • 14
  • 18
36

Three ways:

  1. Enum.GetValues(type) // Since .NET 1.1, not in Silverlight or .NET Compact Framework
  2. type.GetEnumValues() // Only on .NET 4 and above
  3. type.GetFields().Where(x => x.IsLiteral).Select(x => x.GetValue(null)) // Works everywhere

I am not sure why GetEnumValues was introduced on type instances. It isn't very readable at all for me.


Having a helper class like Enum<T> is what is most readable and memorable for me:

public static class Enum<T> where T : struct, IComparable, IFormattable, IConvertible
{
    public static IEnumerable<T> GetValues()
    {
        return (T[])Enum.GetValues(typeof(T));
    }

    public static IEnumerable<string> GetNames()
    {
        return Enum.GetNames(typeof(T));
    }
}

Now you call:

Enum<Suit>.GetValues();

// Or
Enum.GetValues(typeof(Suit)); // Pretty consistent style

One can also use some sort of caching if performance matters, but I don't expect this to be an issue at all.

public static class Enum<T> where T : struct, IComparable, IFormattable, IConvertible
{
    // Lazily loaded
    static T[] values;
    static string[] names;

    public static IEnumerable<T> GetValues()
    {
        return values ?? (values = (T[])Enum.GetValues(typeof(T)));
    }

    public static IEnumerable<string> GetNames()
    {
        return names ?? (names = Enum.GetNames(typeof(T)));
    }
}
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
nawfal
  • 62,042
  • 48
  • 302
  • 339
  • This is a nice summary of methods. I think you should merge your other answer into this though. The truth is that enum are special and looping through them is often (usually) just as valid as enumeration because you know that the values will never change. IOW, If you have an enum that is changing all the time then you've chosen the wrong data construct to begin with. – krowe2 Dec 19 '17 at 17:03
29

There are two ways to iterate an Enum:

1. var values =  Enum.GetValues(typeof(myenum))
2. var values =  Enum.GetNames(typeof(myenum))

The first will give you values in form on an array of **object**s, and the second will give you values in form of an array of **String**s.

Use it in a foreach loop as below:

foreach(var value in values)
{
    // Do operations here
}
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Kylo Ren
  • 7,647
  • 4
  • 36
  • 57
25

I use ToString() then split and parse the spit array in flags.

[Flags]
public enum ABC {
   a = 1,
   b = 2,
   c = 4
};

public IEnumerable<ABC> Getselected (ABC flags)
{
   var values = flags.ToString().Split(',');
   var enums = values.Select(x => (ABC)Enum.Parse(typeof(ABC), x.Trim()));
   return enums;
}

ABC temp= ABC.a | ABC.b;
var list = getSelected (temp);
foreach (var item in list)
{
   Console.WriteLine(item.ToString() + " ID=" + (int)item);
}
Mickey Perlstein
  • 1,894
  • 2
  • 23
  • 31
19

I do not hold the opinion this is better, or even good. I am just stating yet another solution.

If enum values range strictly from 0 to n - 1, a generic alternative is:

public void EnumerateEnum<T>()
{
    int length = Enum.GetValues(typeof(T)).Length;
    for (var i = 0; i < length; i++)
    {
        var @enum = (T)(object)i;
    }
}

If enum values are contiguous and you can provide the first and last element of the enum, then:

public void EnumerateEnum()
{
    for (var i = Suit.Spade; i <= Suit.Diamond; i++)
    {
        var @enum = i;
    }
}

But that's not strictly enumerating, just looping. The second method is much faster than any other approach though...

Community
  • 1
  • 1
nawfal
  • 62,042
  • 48
  • 302
  • 339
17

Here is a working example of creating select options for a DDL:

var resman = ViewModelResources.TimeFrame.ResourceManager;

ViewBag.TimeFrames = from MapOverlayTimeFrames timeFrame
      in Enum.GetValues(typeof(MapOverlayTimeFrames))
      select new SelectListItem
      {
         Value = timeFrame.ToString(),
         Text = resman.GetString(timeFrame.ToString()) ?? timeFrame.ToString()
      };
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
jhilden
  • 10,939
  • 5
  • 43
  • 67
17

If you need speed and type checking at build and run time, this helper method is better than using LINQ to cast each element:

public static T[] GetEnumValues<T>() where T : struct, IComparable, IFormattable, IConvertible
{
    if (typeof(T).BaseType != typeof(Enum))
    {
        throw new ArgumentException(string.Format("{0} is not of type System.Enum", typeof(T)));
    }
    return Enum.GetValues(typeof(T)) as T[];
}

And you can use it like below:

static readonly YourEnum[] _values = GetEnumValues<YourEnum>();

Of course you can return IEnumerable<T>, but that buys you nothing here.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
dmihailescu
  • 1,485
  • 16
  • 14
15

New .NET 5 solution:

.NET 5 has introduced a a generic version for the GetValues method:

Suit[] suitValues = Enum.GetValues<Suit>();

Usage in a foreach loop:

foreach (Suit suit in Enum.GetValues<Suit>())
{

}

which is now by far the most convenient solution.

Arad
  • 1,815
  • 2
  • 19
  • 39
13
foreach (Suit suit in Enum.GetValues(typeof(Suit)))
{
}

(The current accepted answer has a cast that I don't think is needed (although I may be wrong).)

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
matt burns
  • 22,440
  • 9
  • 91
  • 102
13

Add method public static IEnumerable<T> GetValues<T>() to your class, like:

public static IEnumerable<T> GetValues<T>()
{
    return Enum.GetValues(typeof(T)).Cast<T>();
}

Call and pass your enum. Now you can iterate through it using foreach:

 public static void EnumerateAllSuitsDemoMethod()
 {
     // Custom method
     var foos = GetValues<Suit>();
     foreach (var foo in foos)
     {
         // Do something
     }
 }
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
MUT
  • 498
  • 3
  • 17
  • I would add "where T : struct, Enum" to restrict the method to enums. Like this public static IEnumerable ObtenerValores() where T : struct, Enum => Enum.GetValues(typeof(T)).Cast(); – Desmond Jun 19 '20 at 19:00
12

I know it is a bit messy, but if you are fan of one-liners, here is one:

((Suit[])Enum.GetValues(typeof(Suit))).ToList().ForEach(i => DoSomething(i));
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
anar khalilov
  • 15,134
  • 9
  • 43
  • 58
12

This question appears in Chapter 10 of "C# Step by Step 2013"

The author uses a double for-loop to iterate through a pair of Enumerators (to create a full deck of cards):

class Pack
{
    public const int NumSuits = 4;
    public const int CardsPerSuit = 13;
    private PlayingCard[,] cardPack;

    public Pack()
    {
        this.cardPack = new PlayingCard[NumSuits, CardsPerSuit];
        for (Suit suit = Suit.Clubs; suit <= Suit.Spades; suit++)
        {
            for (Value value = Value.Two; value <= Value.Ace; value++)
            {
                cardPack[(int)suit, (int)value] = new PlayingCard(suit, value);
            }
        }
    }
}

In this case, Suit and Value are both enumerations:

enum Suit { Clubs, Diamonds, Hearts, Spades }
enum Value { Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace}

and PlayingCard is a card object with a defined Suit and Value:

class PlayingCard
{
    private readonly Suit suit;
    private readonly Value value;

    public PlayingCard(Suit s, Value v)
    {
        this.suit = s;
        this.value = v;
    }
}
Termininja
  • 5,689
  • 12
  • 40
  • 45
Ross Gatih
  • 386
  • 2
  • 6
10

A simple and generic way to convert an enum to something you can interact:

public static Dictionary<int, string> ToList<T>() where T : struct
{
   return ((IEnumerable<T>)Enum
       .GetValues(typeof(T)))
       .ToDictionary(
           item => Convert.ToInt32(item),
           item => item.ToString());
}

And then:

var enums = EnumHelper.ToList<MyEnum>();
Massimiliano Kraus
  • 3,214
  • 5
  • 20
  • 40
Gabriel
  • 867
  • 10
  • 22
  • A `Dictionary` is not a good idea: if you have an `Enum` like `enum E { A = 0, B = 0 }`, the 0 value is added 2 times generating an `ArgumentException` (you cannot add the same `Key` on a `Dictionary` 2 or more times!). – Massimiliano Kraus Oct 25 '16 at 13:00
  • Why return a `Dictionary` from a method named `ToList`? Also why not return `Dictionary`? – Aluan Haddad Dec 11 '17 at 11:53
9

What if you know the type will be an enum, but you don't know what the exact type is at compile time?

public class EnumHelper
{
    public static IEnumerable<T> GetValues<T>()
    {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }

    public static IEnumerable getListOfEnum(Type type)
    {
        MethodInfo getValuesMethod = typeof(EnumHelper).GetMethod("GetValues").MakeGenericMethod(type);
        return (IEnumerable)getValuesMethod.Invoke(null, null);
    }
}

The method getListOfEnum uses reflection to take any enum type and returns an IEnumerable of all enum values.

Usage:

Type myType = someEnumValue.GetType();

IEnumerable resultEnumerable = getListOfEnum(myType);

foreach (var item in resultEnumerable)
{
    Console.WriteLine(String.Format("Item: {0} Value: {1}",item.ToString(),(int)item));
}
Slappywag
  • 1,093
  • 1
  • 14
  • 23
4

enum types are called "enumeration types" not because they are containers that "enumerate" values (which they aren't), but because they are defined by enumerating the possible values for a variable of that type.

(Actually, that's a bit more complicated than that - enum types are considered to have an "underlying" integer type, which means each enum value corresponds to an integer value (this is typically implicit, but can be manually specified). C# was designed in a way so that you could stuff any integer of that type into the enum variable, even if it isn't a "named" value.)

The System.Enum.GetNames method can be used to retrieve an array of strings which are the names of the enum values, as the name suggests.

EDIT: Should have suggested the System.Enum.GetValues method instead. Oops.

Emily Chen
  • 150
  • 8
  • 2
    Although your answer is correct in itself, it doesn't really address the OP's original question. The `GetNames` method returns, indeed, a string array, but the OP requires an enumerator through the values. – Silviu Preda Jan 15 '18 at 09:30
  • @SilviuPreda: Edited. It should have been GetValues instead of GetNames. – Emily Chen Jan 16 '18 at 20:17
4

For getting a list of int from an enum, use the following. It works!

List<int> listEnumValues = new List<int>();
YourEnumType[] myEnumMembers = (YourEnumType[])Enum.GetValues(typeof(YourEnumType));
foreach ( YourEnumType enumMember in myEnumMembers)
{
    listEnumValues.Add(enumMember.GetHashCode());
}
reza akhlaghi
  • 658
  • 1
  • 8
  • 19
2

When you have a bit enum like this

enum DemoFlags
{
    DemoFlag = 1,
    OtherFlag = 2,
    TestFlag = 4,
    LastFlag = 8,
}

With this assignement

DemoFlags demoFlags = DemoFlags.DemoFlag | DemoFlags.TestFlag;

and need a result like this

"DemoFlag | TestFlag"

this method helps:

public static string ConvertToEnumString<T>(T enumToConvert, string separator = " | ") where T : Enum
{
    StringBuilder convertedEnums = new StringBuilder();

    foreach (T enumValue in Enum.GetValues(typeof(T)))
    {
        if (enumToConvert.HasFlag(enumValue)) convertedEnums.Append($"{ enumValue }{separator}");
    }

    if (convertedEnums.Length > 0) convertedEnums.Length -= separator.Length;

    return convertedEnums.ToString();
}
marsh-wiggle
  • 1,693
  • 2
  • 23
  • 41
1

Also you can bind to the public static members of the enum directly by using reflection:

typeof(Suit).GetMembers(BindingFlags.Public | BindingFlags.Static)
    .ToList().ForEach(x => DoSomething(x.Name));
Termininja
  • 5,689
  • 12
  • 40
  • 45
1

If you have:

enum Suit
{
   Spades,
   Hearts,
   Clubs,
   Diamonds
}

This:

foreach (var e in Enum.GetValues(typeof(Suit)))
{
    Console.WriteLine(e.ToString() + " = " + (int)e);
}

Will output:

Spades = 0
Hearts = 1
Clubs = 2
Diamonds = 3
rlv-dan
  • 796
  • 9
  • 17
0

LINQ Generic Way:

    public static Dictionary<int, string> ToList<T>() where T : struct =>
        ((IEnumerable<T>)Enum.GetValues(typeof(T))).ToDictionary(value => Convert.ToInt32(value), value => value.ToString());

Usage:

        var enums = ToList<Enum>();
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Erçin Dedeoğlu
  • 3,688
  • 4
  • 39
  • 58
0

I think its help you try it.

public class Program
{

    public static List<T> GetEnamList<T>()
    {
        var enums = Enum.GetValues(typeof(T)).Cast<T>().Select(v => v).ToList();
        return enums;
    }
    private void LoadEnumList()
    {
        List<DayofWeek> dayofweeks = GetEnamList<DayofWeek>();

        foreach (var item in dayofweeks)
        {
            dayofweeks.Add(item);
        }
    }
}

    public enum DayofWeek
    {
        Monday,
        Tuesday,
        Wensday,
        Thursday,
        Friday,
        Sturday,
        Sunday
    }
Inam Abbas
  • 292
  • 2
  • 5