使用字符串数组初始化二维char数组

时间:2016-07-10 00:42:56

标签: c# string multidimensional-array char initialization

我遇到了语法问题:以下行正常:

char[,] board = new char[2, 2] { { '1', '2' }, { '3', '4' } };

但如果我有一个字符串数组并试试这个:

char[,] board = new char[2, 2] { "12".ToCharArray(), "34".ToCharArray() };

它给了我错误:CS0846预期嵌套数组初始值设定项。 什么应该是正确的语法,因为我有很长的字符串,并且不使用第一个示例中的char语法?

1 个答案:

答案 0 :(得分:1)

C#语言具有识别多维数组的特殊语法。虽然语法看起来非常类似于锯齿状数组的初始化(例如char[][]),但您无法使用该语法从其他对象执行初始化。

在您的示例中,如果您正在初始化锯齿状数组(或者更确切地说,类似于它:char[][] board2 = new char[][] { "12".ToCharArray(), "34".ToCharArray() };),那么带有字符串文字的语法将起作用,但是对于变量声明中的多维数组的初始化,你必须使用嵌套数组初始值设定项,因为你不像在锯齿状数组中那样初始化单维数组中的单个对象。

编译器需要能够在编译时为单个对象生成所有初始化,并且当您尝试使用在运行时获取的数组初始化二维数组时,它无法执行此操作。 ToCharArray()方法)。

所以,你必须以艰难的方式去做。例如:

string[] rows = { "12", "34" };

for (int i = 0; i < rows.Length; i++)
    for (int j = 0; j < rows[i].Length; j++)
    {
        board[i, j] = rows[i][j];
    }

如果您希望必须经常编写类似的代码,则可以将该逻辑封装在方法中。例如:

private static void InitBoard(char[,] board, params string[] rows)
{
    for (int i = 0; i < rows.Length; i++)
        for (int j = 0; j < rows[i].Length; j++)
        {
            board[i, j] = rows[i][j];
        }
}

这样称呼:

char[,] board = new char[2,2];

InitBoard(board, "12", "34");