Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#我可以用枚举代替int作为for循环吗_C# - Fatal编程技术网

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
也会有同样的问题。这只是一个错误,如果你不想让值的改变引起迭代顺序的改变……对不起,我没有注意到你把它放在了“缺点”部分