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



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

633   9  

9 ответов:

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

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

вопрос:

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

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

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();

перечисление.GetValues(typeof (MyEnum)).Длина;

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

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

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

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

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

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

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

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

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

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

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

var namesCount = (int)MyEnum.Length;

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

Для Visual Basic:

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

Comments

    Ничего не найдено.