Общее количество элементов, определенных в перечислении - PullRequest
279 голосов
/ 13 мая 2009

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

Ответы [ 9 ]

380 голосов
/ 13 мая 2009

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

var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
163 голосов
/ 05 июня 2013

Вопрос:

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

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

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();
70 голосов
/ 13 мая 2009

Enum.GetValues ​​ (TypeOf (MyEnum)) Длина;.

12 голосов
/ 05 июня 2013

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

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

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

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

6 голосов
/ 13 мая 2009

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

 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 голосов
/ 13 мая 2009

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

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

4 голосов
/ 19 сентября 2016

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

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;
}
1 голос
/ 13 ноября 2014

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

var namesCount = (int)MyEnum.Length;

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

1 голос
/ 17 августа 2014

Для Visual Basic:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...