Общее количество элементов, определенных в перечислении

Как я могу получить количество элементов, определенных в перечислении?

Ответ 1

Вы можете использовать статический метод Enum.GetNames, который возвращает массив, представляющий имена всех элементов в перечислении. Свойство length этого массива равно числу элементов, определенных в перечислении

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

Ответ 2

Возникает вопрос:

Как я могу получить количество элементов, определенных в перечислении?

Количество "предметов" может означать две совершенно разные вещи. Рассмотрим следующий пример.

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

Каково количество "элементов", определенных в MyEnum?

Число элементов 5? (A, B, C, D, E)

Или это 3? (1, 2, 3)

Число имен, определенных в MyEnum (5), можно вычислить следующим образом.

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

Число значений, определенных в MyEnum (3), можно вычислить следующим образом.

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

Ответ 4

Отличный трюк, который я видел в ответе C на этот вопрос, просто добавьте последний элемент в перечисление и используем его, чтобы указать, сколько элементов в перечислении:

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

В случае, когда вы определяете начальное значение, отличное от 0, вы можете использовать NumberOfTypes - Type1 для определения количества элементов.

Я не уверен, что этот метод будет быстрее, чем использование Enum, и я также не уверен, будет ли это считаться правильным способом, так как у нас есть Enum для выяснения этой информации для нас.

Ответ 5

Из предыдущих ответов просто добавляется образец кода.

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

Ответ 6

Вы можете использовать Enum.GetNames, чтобы возвращать IEnumerable значений в вашем перечислении, а затем. Получить итоговый IEnumerable.

GetNames производит тот же результат, что и GetValues, но быстрее.

Ответ 7

[Enum].GetNames(typeof(MyEnum)).Length не работал со мной, но [Enum].GetNames(GetType(Animal_Type)).length сделал.

Ответ 8

Если вы обнаружите, что пишете вышеупомянутое решение так часто, как я, то вы можете реализовать его как общий:

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;
}

Ответ 9

Я изучал это только сейчас и не был доволен читабельностью текущего решения. Если вы пишете текст неформально или в небольшом проекте, вы можете просто добавить еще один элемент в конец вашего перечисления под названием "Длина". Таким образом, вам нужно только ввести:

var namesCount = (int)MyEnum.Length;

Конечно, если другие собираются использовать ваш код - или я уверен, что при многих других обстоятельствах, которые не были применимы ко мне в этом случае, это решение может быть от плохого совета до ужасного.