簡體   English   中英

如何將 int 2d 數組`int[,]` 轉換為枚舉 2d 數組`enum[,]`?

[英]How to Convert int 2d array `int[,]` to enum 2d array `enum[,]`?

我有一個網格瓷磚矩陣。

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的 Tor。

邊緣情況不是:

  • 大小不同。 可以使用.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 的各種組合,如 ()。 沒有成功。

由於 .NET 最初設置為處理數組協方差的方式,實際上可以直接將derived[]數組轉換為base[]數組。 這通常被認為是一個壞主意。

但是,在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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM