C#我可以用枚举代替int作为for循环吗
所以,我有一个好主意。我需要在一个平头六边形中循环所有方向。因此,考虑到枚举C#我可以用枚举代替int作为for循环吗,c#,C#,所以,我有一个好主意。我需要在一个平头六边形中循环所有方向。因此,考虑到枚举 public enum HexDirectionFlat { UP, UP_LEFT, DOWN_LEFT, DOWN, DOWN_RIGHT, UP_RIGHT } 那么这是一个有效的for循环吗 for(HexDirectionFlat dir = HexDirectionFlat.UP; dir <= HexDirectionFlat.UP_RIGHT; dir++) for(HexDirect
public enum HexDirectionFlat
{
UP, UP_LEFT, DOWN_LEFT, DOWN, DOWN_RIGHT, UP_RIGHT
}
那么这是一个有效的for循环吗
for(HexDirectionFlat dir = HexDirectionFlat.UP; dir <= HexDirectionFlat.UP_RIGHT; dir++)
for(HexDirectionFlat dir=HexDirectionFlat.UP;dir
那么这是一个有效的for循环吗
for(HexDirectionFlat dir = HexDirectionFlat.UP; dir <= HexDirectionFlat.UP_RIGHT; dir++)
是的,绝对是
如果是,是否存在不使用此选项的性能原因
不,这是一种非常有效的枚举值迭代方法-可能比调用需要分配数组的enum.GetValues
更有效
缺点是:
- 您需要知道枚举的“最低”值(因此,添加一个新的较低值将涉及像这样更改每个循环)
- 您需要知道枚举的“最高”值(因此添加一个新的较低值将涉及像这样更改每个循环)
- 如果枚举有“间隙”(例如值0、1、3、4、5,但没有2),则循环不会跳过这些间隙
- 如果您的枚举直接上升到基础类型的最高值(例如,基于
字节的枚举为255),循环将永远不会终止
您可以使用常量来减少前两点;第三点只与显式值枚举相关;最后一点非常罕见。您可以编写单元测试来检查所有这些点。可以,但可能比直接使用int值慢。公共枚举HexDirectionFlat:int
到sp明确指定基础类型的宽度。为了清晰起见,您可能希望foreach(Enum.GetValues中的HexDirectionFlat dir(typeof(HexDirectionFlat))
尽管如此。只需添加GetValues
即可避免在枚举值发生变化时中断循环(不太脆弱)。“那么这是一个有效的for循环吗?“--你为什么要问我们?试试。编译并运行它。@EugeneSh:这会改变迭代顺序,当然-但是调用Enum.GetValues
也会有同样的问题。这只是一个错误,如果你不想让值的改变引起迭代顺序的改变……对不起,我没有注意到你把它放在了“缺点”部分