可能重复:
如何枚举枚举?
假设我有一个这样的枚举:
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。
您可以使用以下代码循环遍历枚举:
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]);
}
此外,使用 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);