Як я можу визначити кількість елементів, визначених у перерахунку?
Як я можу визначити кількість елементів, визначених у перерахунку?
Відповіді:
Ви можете використовувати статичний метод, Enum.GetNames
який повертає масив, що представляє назви всіх елементів у переліку. Властивість довжини цього масиву дорівнює кількості елементів, визначених в enum
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)). Довжина;
Вишуканий трюк, який я побачив у відповіді С на це запитання, просто додайте останній елемент до enum і використовуйте його, щоб сказати, скільки елементів у переліку:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
У випадку, коли ви визначаєте початкове значення, відмінне від 0, ви можете використовувати NumberOfTypes - Type1 для визначення кількості елементів.
Я не впевнений, що цей метод буде швидшим, ніж використання Enum, і я також не впевнений, чи вважатиметься це правильним способом зробити це, оскільки у нас Enum з'ясував цю інформацію для нас.
Ви можете використовувати Enum.GetNames, щоб повернути IE численні значення у вашій enum, а потім .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
робив.