我该如何声明一个二维字符串数组?

87
string[][] Tablero = new string[3][3];

我需要一个3x3的数组来保存信息。如何在C#中声明它?


3
文档清楚地说明了如何操作:http://msdn.microsoft.com/en-us/library/9b9dty7d.aspx - Esteban Araya
1
请注意,根据上面的链接,OP代码[][](锯齿数组结构)和被接受的答案[,](多维数组)之间存在差异。 - amalgamate
12个回答

119
string[,] Tablero = new string[3,3];

你也可以使用数组初始化语法在同一行实例化它,如下所示:

string[,] Tablero = new string[3, 3] {{"a","b","c"},
                                      {"d","e","f"}, 
                                      {"g","h","i"} };

2
或者如果您使用的是C# 3或更高版本,则为var tablero = new string[3,3]; - bdukes
9
如果您使用数组初始化语法,您不需要提供边界(即,您只需编写new string[,])。 - bdukes
2
你根本不需要写 new string[,] ... 只需写 string [,] Tablero = {{"a","b","c"}, {"d","e","f"}, {"g","h","i"} } 即可。 - Jim Balter
4
为了明确[3, 3]中的第一个3是行数,第二个3是列数(似乎每个人都选择[3, 3]只是为了混淆 :-))。 - bytedev

62
你可能想要这个:
string[,] Tablero = new string[3,3];

这将为您创建一个矩阵样式的数组,其中所有行都具有相同的长度。
您示例中的数组是所谓的不规则数组, 即一个数组的数组,其中元素的大小可以不同。必须以不同的方式创建不规则数组:
string[][] Tablero = new string[3][];
for (int i = 0; i < Tablero.GetLength(0); i++)
{
    Tablero[i] = new string[3];
}

您可以使用初始化器来填充数组元素的数据:
string[,] Tablero = new string[,]
{
    {"1.1", "1.2", "1.3"},
    {"2.1", "2.2", "2.3"},
    {"3.1", "3.2", "3.3"}
};

如果是不规则数组:

string[][] Tablero = new string[][]
{
    new string[] {"1.1", "1.2"},
    new string[] {"2.1", "2.2", "2.3", "2.4"},
    new string[] {"3.1", "3.2", "3.3"}
};

18

你刚刚声明了一个交错数组。这种数组的各个维度可以有不同的大小。例如:

string[][] jaggedStrings =  {
new string[] {"x","y","z"},
new string[] {"x","y"},
new string[] {"x"}
};

在你的情况下,你需要使用常规数组。请参阅上面的答案。 了解更多关于锯齿数组的信息


12

我假设你正在寻找这个:

        string[,] Tablero = new string[3,3];

嵌套数组的语法如下:

        string[][] Tablero = new string[3][];
        for (int ix = 0; ix < 3; ++ix) {
            Tablero[ix] = new string[3];
        }

10

在 C# 中,有两种多维数组类型,分别称为 MultidimensionalJagged

对于多维数组,你可以这样做:

string[,] multi = new string[3, 3];

对于交错数组,你需要编写更多的代码:

string[][] jagged = new string[3][];
            for (int i = 0; i < jagged.Length; i++)
            {
                jagged[i] = new string[3];
            }

简而言之,锯齿数组既更快,又具有直观的语法。有关更多信息,请参见:此Stackoverflow问题


3
对于不规则数组,您可以直接初始化它,例如 string[][] jagged = { new[] { "a", "b", "c" }, new[] { "d", "e", "f" }, new[] { "g", "h", "i" } }; 或者 var jagged = new[] { new[] { "a", "b", "c" }, new[] { "d", "e", "f" }, new[] { "g", "h", "i" } }; - nawfal

9

这是一篇相关的文章。我无法忍受许多msdocs文档中仅使用简单整数作为示例。他们应该至少有几个其他的例子,特别是一个带有字符串的例子。 - Su Llewellyn

6
string[,] Tablero = new string[3,3];

6

string[][]并不是一个二维数组,它是一个数组的数组(也称为“交错数组”)。这是两者之间的区别。

要声明一个二维数组,请使用以下语法:

string[,] tablero = new string[3, 3];

如果你真的想要一个嵌套数组,你需要像这样初始化它:

jagged array


string[][] tablero = new string[][] { new string[3], 
                                      new string[3], 
                                      new string[3] };

6

一个3x3的(多维)数组也可以像这样初始化(您已经声明了它):

string[,] Tablero =  {
                        { "a", "b", "c" },
                        { "d", "e", "f" }, 
                        { "g", "h", "i"} 
                     };

1
-1:这与https://dev59.com/KW865IYBdhLWcg3wcOLG#3814169和https://dev59.com/KW865IYBdhLWcg3wcOLG#3814164相同。 - John Saunders
@JohnSaunders 我不明白。在右侧完全忽略类型是另一回事。 - nawfal
1
不,它完全相同。 - John Saunders
1
@JohnSaunders 我建议一种不同的初始化方式。很少有人知道在数组初始化期间可以省略rhs上的大小甚至类型。当然,它做的是相同的事情。既然问题更像是“如何声明/初始化”,这也是一种方法。请参见Eric的答案,他分别提到了每种技术。 - nawfal
2
好的,我会取消我的踩票,但它似乎已经消失了。 - John Saunders
@JohnSaunders 我从未被踩过,尽管你声称已经这样做了 :) 可能是网络错误.. - nawfal

6
当您尝试创建多维数组时,您只需要在声明中添加逗号即可,如下所示:
string[,] tablero = new string[3,3].

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接