如何在C#中检查锯齿状数组是否为多维数组

  • 本文关键字:数组 是否 锯齿状 c# arrays
  • 更新时间 :
  • 英文 :


我有一个矩阵,它是一个锯齿状数组。矩阵有不同的大小,如下所示:

char[][] grid1 = {
new char[] { '1', '1', '0', '1', '0' },
new char[] { '1', '1', '0', '0', '0' },
new char[] { '0', '0', '0', '0', '0' }
};
char[][] grid2 = {
new char[] { '1' }
};

我遇到的问题是,我需要在矩阵上循环,以获取或设置它的元素。我使用嵌套的for循环来完成这项工作,如下所示:

for (int i = 0; i < grid.Length; i++)
{
for (int j = 0; j < grid[1].Length; j++)
{
System.Console.Write(grid[i][j]);
}
}

上面的循环在grid1上运行良好,因为它是多维的。但我得到了一个网格2的错误,因为它只有一个维度。当我使用"grid[1].Length"时会出现错误。我尝试了"GetLength(1(",但由于第二个维度不存在,我遇到了同样的问题。

如何检查矩阵是多维的以避免引发异常?此外,无论锯齿状阵列有多少维度,它们都是循环锯齿状阵列的一种方式吗?

Jagged数组通过声明始终是多维的。char[][]表示您有一个由多个字符组成的数组。不能将char而不是char[]传递到数组的char[0]元素中,这将导致编译时错误。所以我们从不检查,如果它是多维的,编译器会代替我们来做它

您的实际问题是使用第二行来获取您想要访问的任何行的长度。您总是需要获得要访问的行的长度。

for (int i = 0; i < grid.Length; i++)
{
for (int j = 0; j < grid[i].Length; j++)
{
System.Console.Write(grid[i][j]);
}
}

当使用锯齿状数组时,最糟糕的情况是缺少初始化。例如,

char[][] grid = new int[3][];

您有一个包含以下声明的数组。在这个声明之后,您总是有3行,但其中仍然没有任何数据。它是一个由3个null组成的数组。因此,前面的代码将不起作用。如果您不确定您的锯齿状是否已初始化所有行,那么您应该检查它是否为空。

for (int i = 0; i < grid.Length; i++)
{
if (grid[i] != null)
{
for (int j = 0; j < grid[i].Length; j++)
{
System.Console.Write(grid[i][j]);
}
}
}

EDIT:不要认为这实际上解决了你的问题,但评论中的人似乎是对的,使用grid[0]

for (int i = 0; i < grid.Length; i++)
{
// Check if the current value is an array, if not display the value instead.
if(grid[i] != typeof (char[])
{
System.Console.Write(grid[i]);
continue;
}
for (int j = 0; j < grid[1].Length; j++)
{
System.Console.Write(grid[i][j]);
}
}

如果你确定锯齿状阵列形成一个矩阵(即每个子阵列都有相同的长度(,你可以做:

for (int i = 0; i < grid.Length; i++)
{
// we can be sure that grid[0] always exist it ever goes into the outer loop
for (int j = 0; j < grid[0].Length; j++)
{
System.Console.Write(grid[i][j]);
}
}

但如果是这样的话,您可以使用2D数组char[,],而不是锯齿状数组!

char[,] grid1 = {
{ '1', '1', '0', '1', '0' },
{ '1', '1', '0', '0', '0' },
{ '0', '0', '0', '0', '0' }
};
for (int i = 0 ; i < grid1.GetUpperBound(0) ; i++) {
for (int j = 0 ; j < grid1.GetUpperBound(1) ; i++) {
System.Console.Write(grid[i, j]);
}
}

如果每个子阵列可以有不同的长度,则可以使用grid[i]访问它们的每个长度:

for (int i = 0; i < grid.Length; i++)
{
for (int j = 0; j < grid[i].Length; j++)
{
System.Console.Write(grid[i][j]);
}
}

最新更新