【问题标题】:How do I declare a 2D array of Enum in C#?如何在 C# 中声明 Enum 的二维数组?
【发布时间】:2017-08-17 19:12:18
【问题描述】:

我正在从 Java 切换到 C#,我想知道这是否可能?我想要做的是创建一个Enum {north, south, east, west} 类型的二维数组。这样我就可以打电话给map[1,2].north,看看地图上的那个单元格是否有北墙。

对不起,粗略的代码,我目前无法访问我的电脑,所以我有点抽象。

【问题讨论】:

  • 一个单元格可以有多个墙吗?
  • 由于您来自 Java,您可能想知道 C# 中的 enumsquite a bit weaker

标签: c# arrays enums


【解决方案1】:

对于枚举:

enum Dirs { North, South, East, West }

只需将数组声明为:

Dirs[,] dirs = new Dirs[10, 10];

如果您需要每个单元格能够有多个墙,请使用 [Flags] 属性标记枚举并将值设为 2 的幂:

[Flags]
enum Dirs { North = 1 << 0, South = 1 << 1, East = 1 << 2, West = 1 << 3 }

这样你就可以设置,例如:

dirs[1, 2] = Dirs.North | Dirs.East;

正如@Scott Chamberlain 在他的评论中提到的那样——检查你可以做的方向:

bool hasNorthWall = dirs[1, 2].HasFlag(Dirs.North);

【讨论】:

  • Flags 属性不会更改枚举成员的值。如果使用它,则需要将值显式设置为 2 的幂,否则最终会出现一些不良行为。
  • 为了完成,检查一个方向你可以做var hasNorthWall = dirs[1,2].HasFlag(Dirs.North);
  • @ScottChamberlain 已添加到答案中,谢谢。
  • 另一个有用的提示。当您需要为您的标志设置 2 的幂时,只需使用左移运算符 [Flags] enum Dirs { North = 1&lt;&lt;0, South = 1&lt;&lt;1, East = 1&lt;&lt;2, West = 1&lt;&lt;3 }。当您开始使用许多可能的标志值的枚举时,它会更容易阅读,例如SomeFlag = 1048576 vs SomeFlag = 1&lt;&lt;20
  • @ScottChamberlain 好吧,我同意,对于不记得至少 2 到 16 位的所有幂的人来说,这很有意义。 :p
【解决方案2】:

试试看:

private EnumName[,] arrayName; 

【讨论】:

    【解决方案3】:

    这是您使用enum 声明和测试墙壁的方式。

    namespace ConsoleApplication1
    {
        [Flags]
        enum Wall
        {
            North = 1,
            South = 2,
            East  = 4,
            West  = 8
        }
        static class Program
        {
            static void Main(string[] args)
            {
                int grid = 10;
                var map=new Wall[grid, grid];
                // fill in values here ...
                if(map[1, 2].HasFlag(Wall.North))
                {
                    // cell (2, 3) has a wall in the north direction
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-01
      • 2016-12-09
      • 2021-04-07
      • 1970-01-01
      相关资源
      最近更新 更多