C# C-如何在运行时声明2D数组

C# C-如何在运行时声明2D数组,c#,arrays,arraylist,multidimensional-array,2d,C#,Arrays,Arraylist,Multidimensional Array,2d,我目前正在开发一个控制台扫雷应用程序,其中生成了许多地雷,每个阵列索引需要显示相邻地雷的数量 用户需要定义行数和列数 public class Board { private static int row; private static int column; private static int fields; public static int Row { get => row; set => row = value; } public

我目前正在开发一个控制台扫雷应用程序,其中生成了许多地雷,每个阵列索引需要显示相邻地雷的数量

用户需要定义行数和列数

public class Board
{
    private static int row;
    private static int column;
    private static int fields;

    public static int Row { get => row; set => row = value; }
    public static int Column { get => column; set => column = value; }
    public static int Fields { get => fields ; set => fields = value; }

    Random random = new Random();
    public int randomX;
    public int randomY;


    public string[,] boardArr = new string[Row, Column];

    public void EnterBoardDimensions()
    {
        Console.Write("Enter number of rows: ");
        Row = Convert.ToInt32(Console.ReadLine());

        Console.Write("Enter number of columns: ");
        Column = Convert.ToInt32(Console.ReadLine());

        Console.WriteLine();

        Console.Write("Enter number of fields: ");
        Fields = Convert.ToInt32(Console.ReadLine());
    }

    public void DrawBoard()
    {
        for(int fields = 0; fields < Fields; fields++)
        {
            Console.WriteLine("\n\nField #{0}", fields + 1);
            Console.Write("\n" + row + " x " + column);
            for (int r = 0; r < Row; r++)
            {
                Console.WriteLine("");
                for (int c = 0; c < Column; c++)
                {
                    boardArr[r, c] = ".";

                    //randomX = random.Next(0, Row - 1);
                    //randomY = random.Next(0, Column - 1);

                    boardArr[randomX, randomY] = "*";

                    Console.Write(boardArr[r, c]);
                }
            }
        }   
        Console.ReadLine();
    }
}

在设计时声明数组的类型和名称。具有特定大小的数组对象始终在运行时创建

// Design time
Mine[,] _mineField;

// Run time
_mineField = new Mine[m, n];
这里我假设您已经声明了一个Mine类、结构或枚举。当然,它可以是任何其他类型的int[,],char[,]等等

而且,在大多数情况下,泛型列表已经取代了旧的ArrayList。列表的优点是可以动态增长。但这不是这里的要求。创建阵列对象后,其大小不得更改。如果在下一轮中需要另一个大小,只需创建一个新数组

请注意,数组索引是零绑定的。i、 e.它将具有以下范围:

_mineField[0 .. m - 1, 0 .. n - 1]

您当然可以使用从用户输入中获取的动态值创建二维数组。例如:

Console.WriteLine("Please enter the number of rows: ");
int rows = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Please enter the number of columns: ");
int cols = Convert.ToInt32(Console.ReadLine());

int[,] board = new int[rows, cols];

决心。我没有注意到我在代码之外声明了数组的边界,因此行和列变量默认为0。

但是,使用2D数组无法实现这一点为什么不呢?在运行时声明2D数组是什么意思?声明数组边界?完全正确。例如设置一个5行3列的数组。我已经研究并得出了使用列表的ArrayList的结论。-这不是问题。你到底在问什么?如果您的代码没有达到预期效果,请显示代码并解释问题。请注意,random.NextRow始终返回范围为[0..Row-1]的数字。你还混淆了清除棋盘和定义地雷。fields循环应与行和列循环分开,并在所有元素初始化为后执行..我已经尝试过了,我一直得到一个“索引超出了数组的界限”@iMattu请共享产生该错误的代码。单凭这段代码是不可能的。