2

尝试将字符串写入多维 int 映射。

1,1,1,1,1,1,1,1,1,1,1
1,0,0,0,0,0,0,0,0,0,1
1,0,0,0,0,0,0,0,0,0,1
1,0,0,0,0,0,0,0,0,0,1
1,1,1,1,1,1,1,1,1,1,1

是的,你几乎可以猜到那是为了什么。碰撞地图。但无论如何,此信息存储在一个文件中。现在我得到了文件,转换和等等等等。我将只显示代码并显示我遇到问题的位置,这样可能更容易:

// Convert a string to multi-dim int array,
// format: 1,1,1,1|1,0,0,1|1,1,1,1|
private int[,] ConvertToMapArray(String data) 
{
    // Split to iterate rows and get row count.
    string[] rows = data.Split('|');

    // Initialize return data.
    int[,] ret;

    // Set row count to 0, increment each loop.
    int rc = 0;

    foreach (string row in rows)
    {
        // Split each number and iterate. Convert to int32 and and store in its own int array.
        string[] items = row.Split(',');

        // Initialize int array with proper row count.
        int[] newRow = new int[ items.Count() ];

        // Count set to 0 for foreach iteration, must increment.
        int ic = 0;

        foreach (string item in items )
        {
            // Convert string to int.
            int i int.Parse(item);

            // Add to newRow int array.
            newRow[ic++] = i;
        }

        // Add new int row to return multi-dim array.
        ret[rc++] = newRow;   /// <--- this doesnt work
    }

    return ret;
}
4

3 回答 3

2

你有Rectangular(二维)数组而不是Jagged数组。您可以在此处了解这些数组类型。

int[,] ret; //Rectangular array.

你需要像这样分配值

ret[0,0] = 1;

所以你必须使用for loop instead of foreach来获取索引或行和列。

于 2012-11-13T05:39:59.653 回答
2

您不能将整行分配给 C# 中的多维数组。它不是数组数组。您应该:

  1. 直接分配给行和列ret。例如替换newRow[ic] = iret[rc, ic] = i

  2. 使用锯齿状数组而不是多维数组。锯齿状数组是数组的数组。因此,您可以为其分配一整行。如在

int[][] ret = new int[numberOfRows][];
...
ret[rc] = newRow;
于 2012-11-13T05:51:54.030 回答
1

您已将其声明ret为多维数组,但您将其用作锯齿状数组。将声明更改为:

int[][] ret = new int[rows.Length][];

而且,只是为了好玩,整个事情可以简化为一个 Linq 查询:

private int[][] ConvertToMapArray(String data) 
{
    return data.Split(new [] {'|'}, StringSplitOptions.RemoveEmptyEntries)
               .Select(row => row.Split(',')
                                 .Select(item => {int i; Int32.TryParse(item, out i); return i;})
                                 .ToArray())
               .ToArray();
}

或者,更具可读性:

private int[][] ConvertToMapArray(String arrayData) 
{
    var rowDelimiter = new [] {'|'};
    return arrayData.Split(rowDelimiter, StringSplitOptions.RemoveEmptyEntries)
                    .Select(row => ConvertToMapRow(row))
                    .ToArray();
}

private int[] ConvertToMapRow(String rowData) 
{
    return row.Split(',')
              .Select(item => 
                  {
                      int i; 
                      Int32.TryParse(item, out i); 
                      return i;
                  })
              .ToArray();
}
于 2012-11-13T05:38:58.740 回答