2012-05-08 129 views
4

可能重複:
How to enumerate an enum?迭代枚舉值之間的C#

假設我有這樣的一個枚舉:

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

我是否有機會迭代歐寶和雪鐵龍之間?我想給這些值作爲方法的參數。

+0

'變種汽車= 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); 
} 

但你必須確保開始值小於終值。

編輯
如果沒有硬編碼的開始和結束,但提供它們作爲參數,則需要按照正確的順序使用它們。如果您只是切換「歐寶」和「雪鐵龍」,您將無法獲得輸出。

另外(如註釋中所述),基礎整數值不得包含空位或重疊。幸運的是,如果你自己沒有指定值(即使'= 0'不需要),這將是默認行爲。見MSDN

當你沒有指定枚舉器列表中的元素值,該值將自動以1

+1

@NikhilAgrawal是的。枚舉值是一個整數(默認情況下)。我測試了它(在LinqPad中),它工作正常。 –

+0

+1 buddy –

+3

這依賴於你知道'Enum'的最小值和最大值,它還假定枚舉形成一個連續的整數範圍。從我的Downvote。如果範圍不是連續的,則它不起作用(想想'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]); 
} 

如果你知道你想要開始在歐寶和去雪鐵龍,您設置的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

如果OP要求提供一個通用的解決方案,我會同意你的意見。但是,他沒有,所以我沒有。 – HackedByChinese