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