2012-05-08 2 views
4

Можно создать дубликат:
How to enumerate an enum?Iterate Между Enum значений в C#

Предположим, что у меня есть перечисление вроде:

public enum Cars 
{ 
    Audi = 0, 
    BMW, 
    Opel, 
    Renault, 
    Fiat, 
    Citroen, 
    AlfaRomeo, 
} 

Есть ли у меня шанс итерацию между Opel и Citroen? Я хочу дать эти значения в качестве параметров метода.

+0

'вар cars = Enum.GetValues ​​(typeof (Cars)). Cast () .Where (i => i> = (int) Cars.Opel && i <= (int) Cars.Citroen) .Cast (); ' –

+0

Избегайте использования перечислений для такого рода перечислений. Он вводит кошмар обслуживания, если кто-то вставляет значение, например. И кажется довольно правдоподобным, что ваше программное обеспечение в конечном итоге поддержит другие автомобили. –

ответ

11

Это будет работать:

for(Cars car=Cars.Opel; car<=Cars.Citroen; car++) 
{ 
    Console.WriteLine(car); 
} 

но вы должны убедиться, что начальное значение меньше конечного значения.

EDIT
Если вы не жёстка начала и конца, но поставить их в качестве параметров, вы должны использовать их в правильном порядке. Если вы просто переключите «Opel» и «Citroen», вы не получите выход.

Также (как отмечено в комментариях) базовые целочисленные значения не должны содержать пробелов или перекрытий. К счастью, если вы не указали значения самостоятельно (даже «= 0» не требуется), это будет поведение по умолчанию. См MSDN:

Если вы не зададите значения для элементов в списке перечислителя, значения автоматически увеличивается на 1.

+1

@NikhilAgrawal Да, это будет. Значение enum представляет собой целое число (по умолчанию) под капотом. Я тестировал его (в LinqPad), и он работал нормально. –

+0

+1 от me buddy –

+3

Это зависит от вашего знания минимума и максимума 'Enum', а также предполагает, что перечисления образуют непрерывный диапазон целых чисел. Сдвиньте от меня. Он не работает, если диапазон не является смежным (подумайте 'enum Foo {A = 1, B = 17}'). – jason

3

Вы можете использовать следующий код цикл корыто перечисления:

string[] names = Enum.GetNames(typeof(Cars)); 
Cars[] values = (MyEnum[])Enum.GetValues(typeof(Cars)); 

for(int i = 0; i < names.Length; i++) 
{ 
    print(names[i], values[i]); 
} 

Если вы знаете, что вы хотите, чтобы начать на Opel и перейти к Citroen, вы установите начальные и конечные значения i для правильных индекс в вашем массиве.

Это будет выглядеть примерно так:

string[] names = Enum.GetNames(typeof(Cars)); 
    Cars[] values = (Cars[])Enum.GetValues(typeof(Cars)); 

    int start = names.ToList().IndexOf("Opel"); 
    int end = names.ToList().IndexOf("Citroen") + 1; 

    for (int i = start; i < end; i++) 
    { 
     Console.WriteLine(names[i] + ' ' + values[i]); 
    } 
+0

Если перечисление определило целое число для каждого значения, вы могли бы знать, что это сработает, но как вы полагаетесь на неопределенное поведение для реализации перечисления. -1. – Servy

+0

@Servy В вопросе говорится, что первое значение равно нулю и по умолчанию значения являются последовательными. Конечно, если вы измените поведение по умолчанию, это не сработает, но плакат не делает этого. –

1

Кроме того, с помощью LINQ:

var values = (from e in Enum.GetValues(typeof(Cars)) as Cars[] 
       where e >= Cars.Opel && e <= Cars.Citroen 
       select e); 
// the same as above, but using lambda expressions 
// var values = (Enum.GetValues(typeof(Cars)) as Cars[]).Where(car => car >= Cars.Opel && car <= Cars.Citroen); 

foreach(Cars c in values) Console.WriteLine(c); 
+0

Если перечисление определило целое число для каждого значения, вы могли бы знать, что это сработает, но как вы полагаетесь на неопределенное поведение для реализации перечисления. -1. – Servy

+0

ЕСЛИ ОП запросил обобщенное решение, я бы согласился с вами. Однако он этого не сделал, поэтому я этого не делаю. – HackedByChinese

Смежные вопросы