Rashmi Pandit
Rashmi Pandit

Reputation: 23858

Total number of items defined in an enum

How can I get the number of items defined in an enum?

Upvotes: 448

Views: 370804

Answers (12)

noobsee
noobsee

Reputation: 972

If it only to know how many items inside the ENUM. I will do this instead:

enum MyEnum()
{
  FIRST =  0,
  SECOND = 1,

  TOTAL_ENUM_ITEM
}

The last ENUM item MyEnum.TOTAL_ENUM_ITEM will show you the number of items inside the ENUM.

It's not fancy, but it works :)

Upvotes: -1

There is a more concise way with the generic GetNames() overload:

int itemCount = Enum.GetNames<MyEnum>().Length;

Enum.GetNames<>() method

Upvotes: 1

Lucas Willett
Lucas Willett

Reputation: 419

You can use Enum.GetNames to return an IEnumerable of values in your enum and then. Count the resulting IEnumerable.

GetNames produces much the same result as GetValues but is faster.

Upvotes: 12

ENikS
ENikS

Reputation: 461

I've run a benchmark today and came up with interesting result. Among these three:

var count1 = typeof(TestEnum).GetFields().Length;
var count2 = Enum.GetNames(typeof(TestEnum)).Length;
var count3 = Enum.GetValues(typeof(TestEnum)).Length;

GetNames(enum) is by far the fastest!

|         Method |      Mean |    Error |   StdDev |
|--------------- |---------- |--------- |--------- |
| DeclaredFields |  94.12 ns | 0.878 ns | 0.778 ns |
|       GetNames |  47.15 ns | 0.554 ns | 0.491 ns |
|      GetValues | 671.30 ns | 5.667 ns | 4.732 ns |

Upvotes: 44

Kasper Holdum
Kasper Holdum

Reputation: 13373

You can use the static method Enum.GetNames which returns an array representing the names of all the items in the enum. The length property of this array equals the number of items defined in the enum

var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;

Upvotes: 606

S22
S22

Reputation: 75

For Visual Basic:

[Enum].GetNames(typeof(MyEnum)).Length did not work with me, but [Enum].GetNames(GetType(Animal_Type)).length did.

Upvotes: 4

Matt Parkins
Matt Parkins

Reputation: 24708

If you find yourself writing the above solution as often as I do then you could implement it as a generic:

public static int GetEnumEntries<T>() where T : struct, IConvertible 
{
    if (!typeof(T).IsEnum)
        throw new ArgumentException("T must be an enumerated type");

    return Enum.GetNames(typeof(T)).Length;
}

Upvotes: 5

Timothy Shields
Timothy Shields

Reputation: 79621

The question is:

How can I get the number of items defined in an enum?

The number of "items" could really mean two completely different things. Consider the following example.

enum MyEnum
{
    A = 1,
    B = 2,
    C = 1,
    D = 3,
    E = 2
}

What is the number of "items" defined in MyEnum?

Is the number of items 5? (A, B, C, D, E)

Or is it 3? (1, 2, 3)

The number of names defined in MyEnum (5) can be computed as follows.

var namesCount = Enum.GetNames(typeof(MyEnum)).Length;

The number of values defined in MyEnum (3) can be computed as follows.

var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();

Upvotes: 204

Matt Hamilton
Matt Hamilton

Reputation: 204259

Enum.GetValues(typeof(MyEnum)).Length;

Upvotes: 84

EnergyWasRaw
EnergyWasRaw

Reputation: 134

I was looking into this just now, and wasn't happy with the readability of the current solution. If you're writing code informally or on a small project, you can just add another item to the end of your enum called "Length". This way, you only need to type:

var namesCount = (int)MyEnum.Length;

Of course if others are going to use your code - or I'm sure under many other circumstances that didn't apply to me in this case - this solution may be anywhere from ill advised to terrible.

Upvotes: 1

Josh
Josh

Reputation: 662

A nifty trick I saw in a C answer to this question, just add a last element to the enum and use it to tell how many elements are in the enum:

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

In the case where you're defining a start value other than 0, you can use NumberOfTypes - Type1 to ascertain the number of elements.

I'm unsure if this method would be faster than using Enum, and I'm also not sure if it would be considered the proper way to do this, since we have Enum to ascertain this information for us.

Upvotes: 21

jvanderh
jvanderh

Reputation: 2955

From the previous answers just adding code sample.

 class Program
    {
        static void Main(string[] args)
        {
            int enumlen = Enum.GetNames(typeof(myenum)).Length;
            Console.Write(enumlen);
            Console.Read();
        }
        public enum myenum
        {
            value1,
            value2
        }
    }

Upvotes: 6

Related Questions