Mam następujący kod:
// Obtain the string names of all the elements within myEnum
String[] names = Enum.GetNames( typeof( myEnum ) );
// Obtain the values of all the elements within myEnum
Array values = Enum.GetValues( typeof( myEnum ) );
// Print the names and values to file
for ( int i = 0; i < names.Length; i++ )
{
print( names[i], values[i] );
}
Nie mogę jednak indeksować wartości. Czy jest na to łatwiejszy sposób?
A może całkowicie przegapiłem coś!
Enum.GetName(typeof(MyEnum), val), (int)val)
gdy dane wyjściowe zawierają nazwę i numer wyliczenia.Cast<T>
na wynik:Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>()...
Musisz rzutować tablicę - zwracana tablica jest faktycznie żądanego typu, tj.
myEnum[]
Jeśli pytasz otypeof(myEnum)
:Następnie
values[0]
itpźródło
Możesz rzutować tę tablicę na różne typy tablic:
lub jeśli chcesz wartości całkowite:
Oczywiście możesz iterować te rzutowane tablice :)
źródło
A może lista słowników?
i oczywiście możesz zmienić typ wartości słownika na dowolne wartości wyliczenia.
źródło
Kolejne rozwiązanie, z ciekawymi możliwościami:
źródło
Oto inny. Musieliśmy podać przyjazne nazwy dla naszych wartości EnumValues. Użyliśmy System.ComponentModel.DescriptionAttribute, aby wyświetlić niestandardową wartość ciągu dla każdej wartości wyliczenia.
W użyciu
To zakończy zwracanie „Coś 1”, „Coś 2”
źródło
A co z używaniem pętli foreach, może mógłbyś z tym popracować?
może coś takiego?
źródło
Stare pytanie, ale nieco czystsze podejście przy użyciu LINQ
.Cast<>()
źródło
Array ma metodę GetValue (Int32), której można użyć do pobrania wartości o określonym indeksie.
Array.GetValue
źródło
Możesz to uprościć używając ciągów formatujących. W wiadomościach o użytkowaniu używam następującego fragmentu kodu:
Specyfikator formatu D formatuje wartość wyliczenia jako liczbę dziesiętną. Istnieje również specyfikator X, który podaje dane szesnastkowe.
Specyfikator G formatuje wyliczenie jako ciąg. Jeśli atrybut Flags jest stosowany do wyliczenia, obsługiwane są również wartości połączone. Istnieje specyfikator F, który działa tak, jakby flagi były zawsze obecne.
Zobacz Enum.Format ().
źródło
W wynikach Enum.GetValues rzutowanie na int daje wartość liczbową. Użycie ToString () daje przyjazną nazwę. Żadne inne wywołania Enum.GetName nie są potrzebne.
źródło
Oto prosty sposób na iterację po niestandardowym obiekcie Enum
źródło
Starożytne pytanie, ale odpowiedź 3Dave'a zapewniła najłatwiejsze podejście. Potrzebowałem małej metody pomocnika, aby wygenerować skrypt Sql w celu zdekodowania wartości wyliczenia w bazie danych w celu debugowania. Działało świetnie:
Mam to w metodzie statycznej, więc użycie jest następujące:
źródło