如何制作锯齿阵列?

时间:2019-03-22 13:43:11

标签: c# arrays

像一个简单的数组:

Console.WriteLine("Number: ");
int x = Convert.ToInt32(Console.ReadLine());

string[] strA = new string[x];

strA[0] = "Hello";
strA[1] = "World";    

for(int i = 0;i < x;i++)
{
    Console.WriteLine(strA[i]);
}

现在,我该如何使用双数组?

我已经尝试过:

Console.WriteLine("Number 1: ");
int x = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Number 2: ");
int y = Convert.ToInt32(Console.ReadLine());

// Got an error, right way string[x][];
// But how can I define the second array?
string[][] strA = new string[x][y]; 

strA[0][0] = "Hello";
strA[0][1] = "World";
strA[1][0] = "Thanks";
strA[1][1] = "Guys"; 

for(int i = 0;i < x;i++)
{
    for(int j = 0;i < y;i++)
    {
        // How can I see the items?
        Console.WriteLine(strA[i][j]); 
    }
}

如果有一种更简单的方法,我将很高兴学习它。

这只是出于知识,我是第一次学习双数组,所以请耐心等待:)

这是我的例子: https://dotnetfiddle.net/PQblXH

4 个答案:

答案 0 :(得分:6)

您使用的是锯齿状的数组(即数组string[][]的数组),而不是 2D 的数组(即string[,]

如果要硬编码

  string[][] strA = new string[][] { // array of array
    new string[] {"Hello", "World"}, // 1st line 
    new string[] {"Thanks", "Guys"}, // 2nd line
  };

如果您想提供xy

  string[][] strA = Enumerable
    .Range(0, y)                   // y lines
    .Select(line => new string[x]) // each line - array of x items
    .ToArray(); 

最后,如果我们要在没有 Linq 的情况下初始化strA,但可以很好地完成所有for循环(与2d数组不同, jagged 数组可以包含内部不同长度的数组):

  // strA is array of size "y" os string arrays (i.e. we have "y" lines)
  string[][] strA = new string[y][];

  // each array within strA
  for (int i = 0; i < y; ++i)
    strA[i] = new string[x]; // is an array of size "x" (each line of "x" items)

编辑:让我们逐行打印出锯齿状阵列

旧的for循环

  for (int i = 0; i < strA.Length; ++i) {
    Console.WriteLine();

    // please, note that each line can have its own length
    string[] line = strA[i];

    for (int j = 0; j < line.Length; ++j) {
      Console.Write(line[j]); // or strA[i][j]
      Console.Write(' ');     // delimiter, let it be space
    }
  } 

紧凑代码:

  Console.Write(string.Join(Environment.newLine, strA
    .Select(line => string.Join(" ", line))));

答案 1 :(得分:3)

您使用的是jagged array而不是multidimensional。只需使用[,]而不是[][]。然后,您可以将其与new string[x, y]一起使用。

答案 2 :(得分:1)

首先,您需要在编写代码之前弄清楚头脑中的事情。
我建议用简单的短语写你想做什么。小提琴中的代码无处不在。我将解决小提琴中的代码,而不是您的问题,因为您有错别字错误和其他问题,而小提琴中没有错误,而小提琴中有该问题没有的错误。

为简化问题,请使用清晰易懂的名称。 2d数组将是一个具有行和列的表。

number

您需要先声明表,然后才能知道其大小。

//  1/. Ask for 2table dim sizes.
Console.WriteLine("Enter number of rows:");
var x = int.Parse(Console.ReadLine());
Console.WriteLine("Enter number of columns:");
var y = int.Parse(Console.ReadLine());

var table = new string[x, y];

// 2/. Fill the board for (int row = 0; row < table.GetLength(0); row++) { for (int col = 0; col < table.GetLength(1); col++) { Console.WriteLine($"Enter the value of the cell [{row},{col}]"); table[row, col] = Console.ReadLine(); } } 等效于X,table.GetLength(0)等效于Y,并且可以替换。

table.GetLength(1)

对于以00X,0X0,X00作为输入的3x3表,结果为

// 3/. Display the Table 
Console.Write("\n");
for (int row = 0; row < table.GetLength(0); row++)
{
    for (int col = 0; col < table.GetLength(1); col++)
    {
        Console.Write(table[row, col]);
    }
    Console.Write("\n");
}

有效。在显示时,您可以通过简单地添加逗号或空格来分隔每个单元格。 Fiddle

对于锯齿阵列:

00X
0X0
X00

答案 3 :(得分:0)

使用了错误的变量:

for(int j = 0;i < y;i++) <- Should be j
{
    // How can I see the items?
    Console.WriteLine(strA[i][j]); 
}