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