C# 添加到初始化的多维插槽

C# 添加到初始化的多维插槽,c#,C#,正在尝试将字符串写入多维int-map 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-map

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;
}
//将字符串转换为多维整数数组,
//格式:1,1,1,1 | 1,0,0,1 | 1,1,1,1|
私有int[,]ConvertToMapArray(字符串数据)
{
//拆分以迭代行并获取行数。
string[]rows=data.Split(“|”);
//初始化返回数据。
int[,]ret;
//将行计数设置为0,增加每个循环。
int rc=0;
foreach(行中的字符串行)
{
//拆分每个数字并迭代。转换为int32并存储在自己的int数组中。
string[]items=row.Split(',');
//使用正确的行数初始化int数组。
int[]newRow=newint[items.Count()];
//foreach迭代的计数设置为0,必须递增。
int ic=0;
foreach(项中的字符串项)
{
//将字符串转换为int。
int i int.Parse(项目);
//添加到newRow int数组。
newRow[ic++]=i;
}
//添加新的整数行以返回多维数组。

ret[rc++]=newRow;//您已将
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();
}

您有
矩形
(二维)数组而不是
锯齿状
数组。您可以了解这些数组类型

您需要像这样分配值

ret[0,0] = 1;

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

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

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

  • 使用锯齿状数组而不是多维数组。锯齿状数组是数组的数组。因此可以为其指定整行。如中所示

  • :


    尝试将
    ret
    设置为
    int[][]
    ,这是一个数组数组,然后应该可以工作。我已经编辑了您的标题。请参阅“”,其中一致意见是“不,他们不应该”。我很抱歉,这实际上不是我的本意,但我很感激让我知道未来的知识。有趣的是,现在社区编辑我的代码时包含了一个新的语法错误-。-;
    int I int.Parse(item);
    嗯哼,尽管投票数很多,但这是我最终的答案。这对我来说非常有效:)干杯!
    ret[0,0] = 1;
    
    int[][] ret = new int[numberOfRows][];
    ...
    ret[rc] = newRow;