尝试将字符串写入多维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;
}
答案 0 :(得分:2)
您有Rectangular
(二维)数组而不是Jagged
数组。您可以了解这些数组类型here。
int[,] ret; //Rectangular array.
你需要分配像这样的值
ret[0,0] = 1;
因此,您必须使用for loop instead of foreach
来获取索引或行和列。
答案 1 :(得分:2)
您无法在C#中将整行分配给多维数组。它不是一个数组数组。你应该:
直接分配给ret
的行和列。例如,将newRow[ic] = i
替换为ret[rc, ic] = i
使用锯齿状数组而不是多维数组。锯齿状数组是数组数组。所以你可以给它分配一整行。如
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();
}