添加到初始化的多维插槽

时间:2012-11-13 05:32:02

标签: c#

尝试将字符串写入多维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;
}

3 个答案:

答案 0 :(得分:2)

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

int[,] ret; //Rectangular array.

你需要分配像这样的值

ret[0,0] = 1;

因此,您必须使用for loop instead of foreach来获取索引或行和列。

答案 1 :(得分:2)

您无法在C#中将整行分配给多维数组。它不是一个数组数组。你应该:

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

  2. 使用锯齿状数组而不是多维数组。锯齿状数组是数组数组。所以你可以给它分配一整行。如

  3. int[][] ret = new int[numberOfRows][];
    ...
    ret[rc] = newRow;
    

答案 2 :(得分: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();
}