没有大小的新空白2D数组

时间:2017-08-15 14:39:30

标签: c# arrays string

我需要创建一个我不知道大小的数组。我使用了以下内容,但它在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循环中。它说

  

对象引用未设置为对象的实例。

但是我在开始时确实实例化了字符串?

2 个答案:

答案 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的大小是您想要的内部数组。