【问题标题】:How to Convert int 2d array `int[,]` to enum 2d array `enum[,]`?如何将 int 2d 数组`int[,]` 转换为枚举 2d 数组`enum[,]`?
【发布时间】:2021-03-25 16:15:29
【问题描述】:

我有一个网格,一个瓦片矩阵。

enum Tile
{ 
    Nothing = 0,
    Forest = 1,
    River = 2,
    OB = 3
}

class Grid
{
    public const int X = 6;
    public const int Y = 6;
    private Tile[,] Board { get; set; } 
    public Grid()
    {
        Board = new Tile[X, Y];
    }
}

我想要一个接受int[,] board的Ctor。

不是的边缘情况:

  • 大小不同。可以使用 .GetLength(0) 检查以匹配 const int X 。投掷。
  • 未知的值(Tile)12,设置为默认值 int =0。

所以我有

public Grid(int[,] board)
{
    if (board.GetLength(0) != Y || board.GetLength(1) != X) { 
        throw new ArgumentException();            
    }

    Board = new Tile[Y, X];
    for (int i = 0; i < Y; i++)
    for (int j = 0; j < X; j++) {
        var enumValue = (Enum.IsDefined(typeof(Tile),board[i, j]))? (Tile)board[i, j]: default(Tile) ;
        Board[i, j] = enumValue;
    }
}

有没有直接的方法将 int 2d array int[,] 转换为 enum 2d array enum[,]

我尝试了 Cast 的各种组合,如 ()。没有成功。

【问题讨论】:

    标签: c#


    【解决方案1】:

    由于 .NET 最初设置处理数组协方差的方式,实际上可以将derived[] 的数组直接转换base[] 的数组。 This is generally considered to be a bad idea.

    但是,在enum[] 的情况下您始终可以安全地转换为int[]这是因为enum 默认情况下是int。 (如果您有 enum : byte,则可以转换为 byte[]。)

    但是 C# 不会让你轻易做到这一点。您需要先转换为object

    public Grid(int[,] board)
    {
        if (board.GetLength(0) != Y || board.GetLength(1) != X) { 
            throw new ArgumentException();            
        }
    
        Board = (Tile[,])(object)board;
    }
    

    这有点不安全,因为它只存储传入的数组。如果你想要一个副本,只需调用Clone

    public Grid(int[,] board)
    {
        if (board.GetLength(0) != Y || board.GetLength(1) != X) { 
            throw new ArgumentException();            
        }
    
        Board = (Tile[,])board.Clone();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 2013-01-08
      • 1970-01-01
      • 2016-06-22
      • 2016-12-08
      • 2020-10-26
      相关资源
      最近更新 更多