Общее количество элементов, определенных в перечислении
Как я могу получить количество элементов, определенных в перечислении?
Ответы
Ответ 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();
Ответ 3
Enum.GetValues (typeof (MyEnum)). Длина;
Ответ 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;
Конечно, если другие собираются использовать ваш код - или я уверен, что при многих других обстоятельствах, которые не были применимы ко мне в этом случае, это решение может быть от плохого совета до ужасного.