質問: new double[0,0]の要素数を動的にしたいです。 1次元配列ならarray.resize(ref sample, int length);とかでできますがarray.resizeは2次元に対応していないためこの方法が使えなくて困っています。 なるべくlistを使いたくないのですがどうにかできないでしょうか? やはりポインタを使うべきでしょうか?
回答: 何故listを使いたくないのでしょうか? これによって対処が随分変わります。 object型になるのが嫌であればジェネリクスのlist型もあります。 ■list クラス https://msdn.microsoft.com/ja-jp/library/6sh2ey19(v=vs.110).aspx またパフォーマンス面であればarrayのresizeはするべきではありません。 新規の配列を確保して全データのコピーが行われるため大変重いです。 ■arrayクラスresizeの内部処理 [reliabilitycontract(consistency.willnotcorruptstate, cer.mayfail)] public static void resize(ref t[] array, int newsize) { if (newsize < 0) throw new argumentoutofrangeexception("newsize", environment.getresourcestring("argumentoutofrange_neednonnegnum")); contract.ensures(contract.valueatreturn(out array) != null); contract.ensures(contract.valueatreturn(out array).length == newsize); contract.endcontractblock(); t[] larray = array; if (larray == null) { array = new t[newsize]; return; } if (larray.length != newsize) { t[] newarray = new t[newsize]; array.copy(larray, 0, newarray, 0, larray.length > newsize? newsize : larray.length); array = newarray; } } またポインタで実装するにしても単純な配列であれば、連続してメモリ上に確保できないためリサイズした時にコピーが必要になります。 コピー不要なリサイズ可能な配列な様なものを実装するとなるとリスト構造を自分で作ることになります。 .netのlist配列は10年以上の時間をかけてとてもよく練り上げられたソースになっています。 それ以上のパフォーマンスを出す事はとても難しいでしょう。 もちろん、listであればジャグ配列ならぬジャグリストになるところを最初から二次元リストとして実装できるのでそこの部分は有利であり、listよりパフォーマンスをよくする事が全く不可能とは言いませんがとても難しい事です。 ただ、そこまでパフォーマンスを考えるのであれば、固定長の配列になるように仕様を変えてしまった方が良いでしょう。 また、何らかの理由で二次元配列しか受け取らないメソッドを呼び出すのであれば、listのtoarrayメソッドを利用するとよいでしょう。 長さの変わる間はlist型で動かし、確定した時点で配列に変換する事で、長さが変わる度にコピーしていたものが1度のみのコピーで済ませられます。 最後に...もし...パラメータの配列長等に合わせて配列を定義したいのであれば以下の様な事も可能です。 double[,] sample = new double[param1.length,param2.length]