如何在C#中声明一个二维枚举数组?

3
我正在从Java转向C#,想知道是否可以实现这一点?我的意思是创建一个二维数组,其类型为Enum {north, south, east, west}。这样我就可以调用map[1,2].north来查看地图上该单元格是否有北墙。抱歉代码比较简陋,我目前无法使用电脑,所以有点抽象。

一个细胞可以有多于一堵的墙吗? - John Alexiou
由于您来自Java,您可能想知道C#中的“枚举”要弱得多。 - Rodrick Chapman
3个回答

3

关于枚举:

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);

2
Flags 属性不会更改枚举成员的值。如果您使用它,您需要明确设置值为 2 的幂,否则您将得到一些不良行为。 - Kyle
1
为了完整性,您可以执行以下操作来检查方向:var hasNorthWall = dirs[1,2].HasFlag(Dirs.North); - Scott Chamberlain
@ScottChamberlain 已添加到答案中,谢谢。 - Dmitry
另一个有用的提示。当您需要为标志制作2的幂时,只需使用左移运算符 [Flags] enum Dirs { North = 1<<0, South = 1<<1, East = 1<<2, West = 1<<3 }。当您开始进入使用许多可能的标志值的枚举时,这使得阅读变得更加容易,例如 SomeFlag = 1048576 vs SomeFlag = 1<<20 - Scott Chamberlain
@ScottChamberlain 嗯,我同意,对于那些至少不记得2的16次方的人来说,这是有意义的。 :p - Dmitry
嗯,我开始怀疑枚举类型是否按照我想的那样工作了...最终,我想要一个名为map的二维数组。每个单元格(我想象它像一个电子表格)需要包含6个值:北墙、南墙、东墙、西墙、地板和天花板。这些值应该是整数,因为当北墙=1时,它将是标准的石墙,但如果它=2,则可以是不同的纹理。我想我应该继续创建一个名为“Room”的对象,将这六个整数作为私有变量赋给它,进行get/set操作,并从中创建一个数组。 - Lame Brain

0
尝试这个:
private EnumName[,] arrayName; 

0

这是使用 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
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接