netmajor
netmajor

Reputation: 6585

How to add enum values to a list

I have the following enum:

public enum SymbolWejsciowy
{
     K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 
}

I want to create a list using the values of this enum:

 public List<SymbolWejsciowy> symbol;

I have tried a couple different ways to add the enum values to the list:

SymbolWejsciowy symbol;  
symbol.Add(symbol = SymbolWejsciowy.K1); 

and

symbol.Add(SymbolWejsciowy.K1); 

However, I always get the following exception:

Object reference not set to an instance of an object.

How can I correctly accomplish this?

Upvotes: 19

Views: 41019

Answers (5)

Stokely
Stokely

Reputation: 15769

None of these answers worked for me.

I think most people just want a List<string> or list of values after combining many enums together. This should help:

    static class MyPets {

      enum Cats
      {
        Felix,
        Hairy,
        TunaBreath
      }

      enum Dogs
      {
        Fido,
        Fred,
        Butch
      }

      public static void PrintPets() {

        List<string> Pets = new List<string>();
        Pets.AddRange(Enum.GetNames(typeof(Cats)).ToList());
        Pets.AddRange(Enum.GetNames(typeof(Dogs)).ToList());

        foreach(string p in Pets){
          Console.WriteLine(p);
        }
      }

    }


// RESULT

Felix
Hairy
TunaBreath
Fido
Fred
Butch

Upvotes: 0

Jay Bazuzi
Jay Bazuzi

Reputation: 46496

It sure would be nice if Enum.GetValues() had been updated for generics way back in C# 2.0. Well, guess we have to write it ourselves:

static class EnumHelpers<T> where T : struct
{
    public class NotAnEnumException : Exception
    {
        public NotAnEnumException() : base(string.Format(@"Type ""{0}"" is not an Enum type.", typeof(T))) { }
    }

    static EnumHelpers()
    {
        if (typeof(T).BaseType != typeof(Enum)) throw new NotAnEnumException();
    }

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

    public static T Parse(string value)
    {
        return (T)Enum.Parse(typeof(T), value);
    }
}

I included Parse() because it benefits from generics in the same way.

Usage:

        var symbols = EnumHelpers<SymbolWejsciowy>.GetValues().ToList();

        SymbolWejsciowy s = EnumHelpers<SymbolWejsciowy>.Parse("S2");

(ASIDE: I also wish you could write where T : enum for just this sort of thing. Also, where T : delegate.)

Upvotes: 0

Mark Byers
Mark Byers

Reputation: 837996

As other answers have already pointed out, the problem is that you have declared a list, but you haven't constructed one so you get a NullReferenceException when you try to add elements.

Note that if you want to construct a new list you can use the more concise collection initializer syntax:

List<SymbolWejsciowy> symbols = new List<SymbolWejsciowy> 
{
    SymbolWejsciowy.K1,
    SymbolWejsciowy.K2,
    // ...
};

If you want a list containing all the values then you can get that by calling Enum.GetValues:

List<SymbolWejsciowy> symbols = Enum.GetValues(typeof(SymbolWejsciowy))
                                    .Cast<SymbolWejsciowy>()
                                    .ToList();

Upvotes: 25

msergeant
msergeant

Reputation: 4801

Your code never initializes the list. Try this:

public List<SymbolWejsciowy> symbol = new List<SymbolWejsciowy>();
symbol.Add(SymbolWejsciowy.K1);

and

SymbolWejsciowy mySymbol= SymbolWejsciowy.K2;
symbol.Add(mySymbol);

Upvotes: 2

Claudio Redi
Claudio Redi

Reputation: 68400

In your option 1 SymbolWejsciowy instance and your list have the same name, I imagine that's a typo error.

Without taking that into account I'd say you didn't created the instance of the list

symbol = new List<SymbolWejsciowy>();

Upvotes: 3

Related Questions