2014-11-12 19 views
7

Biorąc pod uwagę C# wyliczenia:Loop poprzez klawisze C# wyliczenia i wartości

public enum stuffEnum: int 
{ 
    New = 0, 
    Old = 1, 
    Fresh = 2 
} 

Jak to zrobić pętlę przez nią w sposób, który można skopiować zarówno klucz i jego wartość w pojedynczej pętli? Coś jak:

foreach(var item in stuffEnum) 
{ 
    NewObject thing = new NewObject{ 
     Name = item.Key, 
     Number = item.Value 
    } 
} 

Więc byś skończyć z 3 obiektów, z ich właściwości Name ustawiony na „New”, „Stary” i „Fresh”, a właściwości Liczba ustawiony na 0, 1 i 2.

Jak to zrobić?

+0

http://stackoverflow.com/questions/972307/can-you-loop-through-all-enum-values ​​ –

+0

Ci wykazują wyliczenia z pojedynczych elementów (lub tylko przycisków). Moje wyliczenie ma pary klucz/wartość i dlatego jest inne. – ohyeah

+3

@BasR. Nie, nie jest inaczej, po prostu jawnie definiujesz wartości. rzucenie wartości wyliczeniowej na "int" da ci wartość. – Rotem

Odpowiedz

10

Klasę Enum ma metod, których szukasz.

foreach(int i in Enum.GetValues(typeof(stuff))) 
{ 
    String name = Enum.GetName(typeof(stuff), i); 
    NewObject thing = new NewObject 
    { 
     Name = name, 
     Number = i 
    }; 
} 
7

Można użyć LINQ (jak prawie zawsze):

List<NewObject> stuff = Enum.GetValues(typeof(stuffEnum)).Cast<stuffEnum>() 
    .Select(s => new NewObject { Name = s.ToString(), Number = (int) s }) 
    .ToList(); 
+1

W porównaniu do innych odpowiedzi odpowiedź powinna być (a) pierwsza, (b) łatwa do odczytania, (c) szybka do wykonania, (d) ćwiczenia z wykorzystaniem największej liczby różnych słów kluczowych, których trzeba się nauczyć? Mój obecny zakład to (d), ale może się mylę i jest niewypowiedziany (e) nie dostałem? – xmojmr

+1

@xmojmr: Zamierzam zgadnąć jakąś kombinację (b) łatwego do odczytania i (e) używa LINQ. Wiele osób uważa, że ​​LINQ jest łatwe do odczytania. Ponadto ma przewagę zwięzłości. Każdy, kto zna się na LINQ, powinien znać wszystkie metody rozszerzeń, których używa Tim, a to wszystko, czego naprawdę używa, a których inne odpowiedzi nie używają (no, to i lambda). – Brian

+0

@Brian Brakowało mi (e) bardzo powinien czcić LINQ. W tym kodzie brakuje 'foreach', więc jest najdłuższy i generuje najwięcej instrukcji MSIL (debugowałem to, co kilka razy wykonuje LINQ .NET Framework), nie zwiększa wydajności przestrzeni ani wydajności czasu i jest najbardziej gęsty (nie białe spacje), więc spowalnia czytanie. Zastanawiałem się, czy istnieje jakaś ukryta korzyść z używania tego stylu w inny sposób niż jest to możliwe. Ale rozumiem, że jest to kwestia gustu i mój komentarz był praktycznie bezcelowy i odpowiedź na pytanie OP brzmiała: – xmojmr

3
foreach (var enumValue in Enum.GetValues(typeof(StuffEnum))) 
{ 
    Console.WriteLine("Name: {0}, Value: {1}", enumValue, (int)enumValue); 
} 

skutkuje

Name: New, Value: 0 
Name: Old, Value: 1 
Name: Fresh, Value: 2 
Powiązane problemy