C# 如何将int 2d数组`int[,]`转换为enum 2d数组`enum[,]`?
我有一个网格和一个矩阵的瓷砖C# 如何将int 2d数组`int[,]`转换为enum 2d数组`enum[,]`?,c#,C#,我有一个网格和一个矩阵的瓷砖 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
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[,]板的Ctor
不符合以下条件的边缘情况:
- 不同的尺寸。可以使用
进行检查,以匹配常量int X。扔.GetLength(0)
- 未知的值
,设置为默认值int=0(平铺)12
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[,]板)
{
如果(board.GetLength(0)!=Y | | board.GetLength(1)!=X){
抛出新ArgumentException();
}
板=新瓷砖[Y,X];
for(int i=0;iint[,]
强制转换为enum 2d数组enum[,]
我尝试各种演员组合,如,()。没有成功。由于.NET最初是用来处理数组协方差的,因此实际上可以直接将
派生[]
数组转换为基[]
数组
但是,在enum[]
的情况下,您始终可以安全地强制转换到int[]
。这是因为enum
默认情况下是int
。(如果您有enum:byte
可以强制转换为byte[]
)
但C#不会让你轻易做到。您需要先强制转换到对象
公共电网(int[,]板)
{
如果(board.GetLength(0)!=Y | | board.GetLength(1)!=X){
抛出新ArgumentException();
}
板=(瓷砖[,])(对象)板;
}
这有点不安全,因为它只存储传入的数组。如果您需要副本,只需调用Clone
:
公共电网(int[,]板)
{
如果(board.GetLength(0)!=Y | | board.GetLength(1)!=X){
抛出新ArgumentException();
}
Board=(Tile[,])Board.Clone();
}
由于.NET最初是用来处理数组协方差的,因此实际上可以直接将
派生[]
数组转换为基[]
数组
但是,在enum[]
的情况下,您始终可以安全地强制转换到int[]
。这是因为enum
默认情况下是int
。(如果您有enum:byte
可以强制转换为byte[]
)
但C#不会让你轻易做到。您需要先强制转换到对象
公共电网(int[,]板)
{
如果(board.GetLength(0)!=Y | | board.GetLength(1)!=X){
抛出新ArgumentException();
}
板=(瓷砖[,])(对象)板;
}
这有点不安全,因为它只存储传入的数组。如果您需要副本,只需调用Clone
:
公共电网(int[,]板)
{
如果(board.GetLength(0)!=Y | | board.GetLength(1)!=X){
抛出新ArgumentException();
}
Board=(Tile[,])Board.Clone();
}