我有一个二维数组,我需要加载数据.我知道数据的宽度(22个值),但我不知道高度(估计大约4000个记录,但变量).
我声明如下:
float[,] _calibrationSet; .... int calibrationRow = 0; While (recordsToRead) { for (int i = 0; i < SensorCount; i++) { _calibrationSet[calibrationRow, i] = calibrationArrayView.ReadFloat(); } calibrationRow++; }
这会导致NullReferenceException,所以当我尝试像这样初始化它时:
_calibrationSet = new float[,];
我得到一个"数组创建必须有数组大小或数组初始化程序."
谢谢,基思
你不能使用数组.或者更确切地说,你需要选择一个大小,如果你最终需要更多,那么你将不得不分配一个新的,更大的数组,将数据从旧的数据复制到新的数组中,并继续像以前一样(直到你超过新的大小......)
通常,您会使用其中一个集合类 - ArrayList,List <>,LinkedList <>等 - 这取决于您正在寻找的内容; List将为您提供与我最初描述的最接近的内容,而LinkedList <>将避免频繁重新分配的问题(以较慢的访问和更大的内存使用为代价).
例:
List_calibrationSet = new List (); // ... while (recordsToRead) { float[] record = new float[SensorCount]; for (int i = 0; i < SensorCount; i++) { record[i] = calibrationArrayView.ReadFloat(); } _calibrationSet.Add(record); } // access later: _calibrationSet[record][sensor]
哦,值得注意的是(正如Grauenwolf所做的那样),我在这里所做的并没有给你提供与单个多维数组相同的内存结构 - 在引擎盖下,它是对其他数组的引用数组实际上持有数据.通过使重新分配更便宜,这可以加快构建阵列的速度,但是可以对访问速度(当然还有内存使用)产生影响.这对你来说是否是一个问题,很大程度上取决于你在加载后对数据的处理方式......以及是否有200条记录或200万条记录.