Iterate Between Enum Values in C#
Possible Duplicate:
How to enumerate an enum?
假设我有一个这样的枚举:
1 2 3 4 5 6 7 8 9 10
| public enum Cars
{
Audi = 0,
BMW,
Opel,
Renault,
Fiat,
Citroen,
AlfaRomeo,
} |
我有机会在欧宝和雪铁龙之间迭代吗?我想把这些值作为方法的参数。
- var cars = Enum.GetValues(typeof (Cars)).Cast().Where(i => i>=(int)Cars.Opel && i<=(int)Cars.Citroen).Cast();
- 避免对此类枚举使用枚举。例如,如果有人插入了一个值,它将引入一个维护噩梦。而且,你的软件最终会支持其他汽车,这似乎相当合理。
这将起作用:
1 2 3 4
| for(Cars car=Cars.Opel; car<=Cars.Citroen; car++)
{
Console.WriteLine(car);
} |
但必须确保起始值小于结束值。
编辑如果没有对开始和结束进行硬编码,但将它们作为参数提供,则需要按正确的顺序使用它们。如果你只是切换"欧宝"和"雪铁龙",你将得不到输出。
此外(如注释中所述),基础整数值不得包含间隙或重叠。幸运的是,如果您自己不指定值(甚至不需要"=0"),这将是默认行为。参见MSDN:
When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1.
- @尼基拉格拉沃是的,会的。枚举值是引擎盖下的整数(默认情况下)。我(在林肯帕德)测试过,效果很好。
- +我的一个朋友
- 这取决于您知道Enum的最小值和最大值,并且它还假定枚举形成一个连续的整数范围。我投反对票。如果范围不是连续的,它就不起作用(想想enum Foo { A = 1, B = 17 })。
- @杰森-谢谢你对投票否决的解释(我想知道)。我知道这取决于顺序等,这就是为什么要说"开始不到结束"的原因。
- @汉斯·凯斯汀:这不仅仅是命令。另外,假设这些值形成一个连续的序列;它们不需要,如果不需要,这个循环就不会生成正确的值。
- 如果枚举为每个值定义了整数,那么您就可以知道这是可行的,但是对于枚举的实现,您也依赖于未定义的行为。- 1。
- @servy-如果不为枚举值定义值,那么默认情况下,对于第一个定义的值,它们从零开始,对于以下值,它们是"一个以上"。请参阅msdn.microsoft.com/en-us/library/cc138362.aspx,它是定义的行为。
- 我不明白否决票,如果你想在欧宝和雪铁龙之间重复,那是因为你知道顺序不会改变。这不是一个很好的实践使用枚举,但汉斯完美地回答了这个问题。
可以使用以下代码通过枚举循环:
1 2 3 4 5 6 7
| 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,那么您可以将EDOCX1的起始值和结束值设置为数组中的正确索引。
看起来像这样:
1 2 3 4 5 6 7 8 9 10
| 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。
- @这个问题说明第一个值是零,默认情况下,值是连续的。当然,如果你改变了默认的行为,这是行不通的,但是海报没有这样做。
此外,使用LINQ:
1 2 3 4 5 6 7
| 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。
- 如果OP要求一个广义解,我同意你的观点。但是,他没有,所以我没有。