Jak mogę uzyskać liczbę elementów zdefiniowanych w wyliczeniu?
Jak mogę uzyskać liczbę elementów zdefiniowanych w wyliczeniu?
Odpowiedzi:
Możesz użyć metody statycznej, Enum.GetNames
która zwraca tablicę reprezentującą nazwy wszystkich elementów w wyliczeniu. Właściwość length tej tablicy jest równa liczbie elementów zdefiniowanych w wyliczeniu
var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
Pytanie brzmi:
Jak mogę uzyskać liczbę elementów zdefiniowanych w wyliczeniu?
Liczba „przedmiotów” może naprawdę oznaczać dwie zupełnie różne rzeczy. Rozważ następujący przykład.
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
Jaka jest liczba „przedmiotów” zdefiniowanych w MyEnum
?
Czy liczba pozycji wynosi 5? ( A
, B
, C
, D
, E
)
Czy to jest 3? ( 1
, 2
, 3
)
Liczbę nazw zdefiniowanych w MyEnum
(5) można obliczyć w następujący sposób.
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
Liczbę wartości zdefiniowanych w MyEnum
(3) można obliczyć w następujący sposób.
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 )). Długość;
Sprytna sztuczka, którą widziałem w odpowiedzi C na to pytanie, po prostu dodaj ostatni element do wyliczenia i użyj go, aby powiedzieć, ile elementów jest w tym wyliczeniu:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
W przypadku, gdy definiujesz wartość początkową inną niż 0, możesz użyć NumberOfTypes - Type1, aby ustalić liczbę elementów.
Nie jestem pewien, czy ta metoda byłaby szybsza niż używanie Enum, a także nie jestem pewien, czy uznano by to za właściwy sposób, aby to zrobić, ponieważ mamy Enum do sprawdzenia dla nas tych informacji.
Możesz użyć Enum.GetNames, aby zwrócić IEnumerable wartości w twoim enum, a następnie .Count wynikowy IEnumerable.
GetNames daje taki sam wynik jak GetValues, ale jest szybszy.
Jeśli zauważysz, że piszesz powyższe rozwiązanie tak często jak ja, możesz zaimplementować je jako ogólne:
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;
}
Właśnie się tym zajmowałem i nie byłem zadowolony z czytelności obecnego rozwiązania. Jeśli piszesz kod nieformalnie lub w małym projekcie, możesz po prostu dodać kolejny element na końcu wyliczenia o nazwie „Długość”. W ten sposób wystarczy wpisać:
var namesCount = (int)MyEnum.Length;
Oczywiście, jeśli inni zamierzają użyć twojego kodu - lub jestem pewien, że w wielu innych okolicznościach, które nie dotyczyły mnie w tym przypadku - to rozwiązanie może być gdziekolwiek, od złej porady po straszne.
W przypadku Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
nie działało ze mną, ale działało
[Enum].GetNames(GetType(Animal_Type)).length
.