我需要创建一个我不知道大小的数组。我使用了以下内容,但它在for -loop中给出了一个索引超出范围的错误。
string[] arr = s.Split('\n');
int[] indices = new int[arr.Length];
string[][] new_arr = new string[arr.Length][];
for (int i = 0; i < arr.Length; i++)
{
if (arr[i].StartsWith("21"))
{
indices[i] = i;
}
}
indices = indices.Where(val => val != 0).ToArray(); //contains indices of records beginning with 21
for (int i = 0; i < indices.Length - 1; i++)
{
new_arr[0][i] = arr[i];
} //first n elements
错误发生在第二个for循环中。它说
对象引用未设置为对象的实例。
但是我在开始时确实实例化了字符串?
答案 0 :(得分:0)
您只需要初始化锯齿状数组中的每个数组:
indices = indices.Where(val => val != 0).ToArray(); //contains indices of records beginning with 21
// create second-level array
new_arr[0] = new string[indices.Length] ;
for (int i = 0; i < indices.Length - 1; i++)
{
new_arr[0][i] = arr[i]; // why 0 here?
}
答案 1 :(得分:0)
对于二维数组,您必须指定第一个维的大小。当我看到你的代码时,它正在使用所谓的锯齿状数组(包含数组的数组作为元素),而不是纯粹的二维数组。
var array1 = new int[2,10]; // this is a 2 dimensional array
var array2 = new int[2][]; // this is an array of 2 elements where each element is an `int[]`
如您所知,我们不需要指定内部元素的大小int[]
现在您了解了锯齿状数组,您可以看到您没有初始化内部元素,只是简单地访问它 - 并且因为默认情况下它是null,所以您点击了异常。
for (int i = 0; i < indices.Length - 1; i++)
{
new_arr[0][i] = arr[i];
} //first n elements
在上面的代码中,您应该有new_arr[i][0] = arr[i]
,并且在该行之前需要执行new_arr[i] = new int[x]
,其中x
的大小是您想要的内部数组。