ジャグ配列を作成しようとしていますが、使用しているデータの動的性のために、大きなジャグ配列を作成するリソースを無駄にしたくありません。
私は現在やっています:
int[][][] data = new data[Int16.MaxValue][][];
データセットの大きさがわからない、またはリスト経由で行うよりも良い方法はありますか?
ジャグ配列を作成しようとしていますが、使用しているデータの動的性のために、大きなジャグ配列を作成するリソースを無駄にしたくありません。
私は現在やっています:
int[][][] data = new data[Int16.MaxValue][][];
データセットの大きさがわからない、またはリスト経由で行うよりも良い方法はありますか?
はい、使用する必要がありますList<T>
。
この場合、 を使用しますList<List<List<int>>>
。
あなたの配列:
int[][][] data = new data[Int16.MaxValue][Int16.MaxValue][Int16.MaxValue];
(2^16)^3 = 2^48 = あなたが持っているよりもはるかに多くの記憶域を占有します。その宣言が有効な C# ではないことは言うまでもありません。
初期化時に必要な容量がわからない場合は、動的にサイズ変更するリストを使用することをお勧めします。
次のような変数を使用します。
List<List<List<int>>> data = new List<List<List<int>>>();
この変数を使用すると、それに を追加できます。List<List<int>>
これらのリストには が含まれてList<int>
おり、もちろん も含まれていますint
。
リストを絶対に使用したくない場合は、リストがフードの下で行うことをいつでも複製できます。少数の要素で配列を作成し、最大数に達したら、元のサイズの 2 倍の新しい配列を作成し、コピーします。既存の配列をそこに入れ、オリジナルを処分します。完了するまでこのパターンを続けます。代わりにリストを使用することをお勧めしますが、これは、何らかの理由でリストを使用したくない場合に回避する方法です。
実際、2 番目以降の次元を定義しなくても、ジャグ配列を作成できます。
int[][][] jagged = new int[256][][];
しかし、大規模なデータセットでは、ストリーミング データを使用する方が効果的です。つまり、IEnumerable<T>
.