いまの初期化に2次元配列などが、わからないときのサイズ

StackOverflow https://stackoverflow.com/questions/50558

  •  09-06-2019
  •  | 
  •  

質問

私には二次元配列による負荷データです。ピックアップしました。幅のデータ(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[,];

または、"配列を創出してい配列のサイズまたは配列初期化."

お Keith

役に立ちましたか?

解決

使用できません。というか、する必要があり、サイズがあまり必要はありますが新たに割り付け、配列をコピーしてからのデータは古いもののいてしまいましたが、継続して前(までを超えるサイズの新たな一---)

一般的には、どう攻略しろとのコレクションクラス-ArrayList一覧<>,LinkedList<>等-するよういくえんまりとした;リストに最も近いものにしていたんですが、その記載は、当初、LinkedList<>致問題を回避するための頻繁な再配分のコストの減速とアクセスよりメモリ使用).

例:

List<float[]> _calibrationSet = new List<float[]>();

// ...

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 かったと思いここにしない同じメモリー構造として、多次元配列の下にフード、その配列への参照の配列ではないということです。この加速ビルの配列の良い対応により再配分を安価にも影響を与えることができアクセス速度やメモリ使用).ているかどうかも問題でよくかきっと、データのロード...とがあるかどうか二百記録は百万円。

他のヒント

できない配列を生成します。当期に対して宣言を参照することを明らかに例を指定しなくても、寸法、明示的又は黙示的に指定するセットリテラル値ときに初期化します。(例:int[,]array4= { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };)

を使用する必要があり、可変サイズのデータ構造(汎用の一覧22-要素の1次元配列するのでもっとも単純な方法とその配分に配列およびコピーのデータでお読み込みが終了しあけましておめでとうございますどのように多くの列にあります。

私だけリストに変換して、そのリストを配列に格納します。

まこってギザギザ配列(float[][])の代わりにクエア配列(float[,]).このほか、"標準"の仕事ぶりに、より高速にします。変換の際にこのデータからリストを配列してコピー[calibrationRow]ポインタ.使用エア配列というコピー[calibrationRow]x[SensorCount]浮かぶ.

        var tempCalibrationSet = new List<float[]>();
        const int SensorCount = 22;
        int calibrationRow = 0;

        while (recordsToRead())
        {
            tempCalibrationSet[calibrationRow] = new float[SensorCount];

            for (int i = 0; i < SensorCount; i++)
            {
                tempCalibrationSet[calibrationRow][i] = calibrationArrayView.ReadFloat();
            } calibrationRow++;
        }

        float[][] _calibrationSet = tempCalibrationSet.ToArray();

私は一般的に使用すぐにコレクションは、この種の仕事(リストArrayList等) その場合は本当に必要なキャストT[,がんに行われます。

いどちらかが必要preallocate配列の最大サイズ(float[999,22])または、異なるデータ構造です。

思コピー-サイズの変更にフライ..(とは言えないように思いました)

と思い、リストの音をリーズナブル。

このまま利用いた二次元ArrayListからシステム。収集した--を作成しますArrayList、他のArrayListることを確認できます。この動的なサイズ変更必要なものを犠牲にベルギー-ルクセンブルグオーバーヘッド。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top