假設我有這樣的一個枚舉:
public enum Cars
{
Audi = 0,
BMW,
Opel,
Renault,
Fiat,
Citroen,
AlfaRomeo,
}
我是否有機會迭代歐寶和雪鐵龍之間?我想給這些值作爲方法的參數。
假設我有這樣的一個枚舉:
public enum Cars
{
Audi = 0,
BMW,
Opel,
Renault,
Fiat,
Citroen,
AlfaRomeo,
}
我是否有機會迭代歐寶和雪鐵龍之間?我想給這些值作爲方法的參數。
這將工作:
for(Cars car=Cars.Opel; car<=Cars.Citroen; car++)
{
Console.WriteLine(car);
}
但你必須確保開始值小於終值。
編輯
如果沒有硬編碼的開始和結束,但提供它們作爲參數,則需要按照正確的順序使用它們。如果您只是切換「歐寶」和「雪鐵龍」,您將無法獲得輸出。
另外(如註釋中所述),基礎整數值不得包含空位或重疊。幸運的是,如果你自己沒有指定值(即使'= 0'不需要),這將是默認行爲。見MSDN:
當你沒有指定枚舉器列表中的元素值,該值將自動以1
@NikhilAgrawal是的。枚舉值是一個整數(默認情況下)。我測試了它(在LinqPad中),它工作正常。 –
+1 buddy –
這依賴於你知道'Enum'的最小值和最大值,它還假定枚舉形成一個連續的整數範圍。從我的Downvote。如果範圍不是連續的,則它不起作用(想想'enum Foo {A = 1,B = 17}')。 – jason
您可以使用下面的代碼循環通過枚舉:
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]);
}
如果枚舉爲每個值定義了整數,那麼您可能知道這會起作用,但正如您依賴未定義的行爲來實現枚舉。 -1。 – Servy
@Servy該問題指出第一個值爲零,默認情況下這些值是連續的。當然,如果你改變默認行爲,這將不起作用,但海報並沒有這樣做。 –
而且遞增,使用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);
如果枚舉爲每個值定義了整數,那麼您可能知道這會起作用,但正如您依賴未定義的行爲來實現枚舉。 -1。 – Servy
如果OP要求提供一個通用的解決方案,我會同意你的意見。但是,他沒有,所以我沒有。 – HackedByChinese
'變種汽車= Enum.GetValues(typeof(Cars))。Cast().Where(i => i> =(int)Cars.Opel && i <=(int)Cars.Citroen).Cast ();' –
避免使用枚舉來進行這種枚舉。例如,如果有人插入一個值,它會引入維護噩夢。而且,你的軟件最終還是會支持其他汽車,這似乎相當合理。 –