Ответы:
Вы можете использовать статический метод, 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();
var valuesCount = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Distinct().Count();
.
Default = 1, A4 = 1, Portrate = 1, A4Portrait = 1, Landscape = 2, A4Landscape = 2, ...
;).
Enum.GetValues (typeof (MyEnum)). Длина;
Отличный трюк, который я видел в ответе C на этот вопрос, просто добавьте последний элемент в enum и используйте его, чтобы указать, сколько элементов в enum:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
В случае, когда вы определяете начальное значение, отличное от 0, вы можете использовать NumberOfTypes - Type1 для определения количества элементов.
Я не уверен, что этот метод будет быстрее, чем использование Enum, и я также не уверен, будет ли он рассматриваться как правильный способ сделать это, так как у нас есть Enum, чтобы выяснить эту информацию для нас.
Вы можете использовать Enum.GetNames, чтобы возвратить IEnumerable значений в вашем перечислении, а затем .Count получить итоговый 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
сделал.