私は極端に大きな配列で作業する必要があるプログラムがあります。 2次元配列を使用する必要があります。C#の配列のインデックス型をInt64に変更します。
私は古典的なbool[,]
を使用しましたが、インデックスが大きすぎると宣言しようとするとSystem.OutOfMemoryException
が投げられました。 (bool[,] foo = new bool[width + bar, height]
を使用)。数字width
とbar
はどちらも極端に大きかったので、インデックスを超えました。
インデックスの種類をInt64(long)に変更するにはどうすればよいですか?私はDictionary<ulong, bool>
を使うことができると知っていますが、アプリケーションのほぼすべてのコードを書き直す必要があり、辞書が必要なLINQメソッドを持っている場合は、それが2次元の辞書で動作するのであれば。
おかげで、ピーター
EDIT 1:ここでは は(注:私はちょうどsizeX = 2000000000
でそれをテストしてみた、それは例外を投げた):コードだ問題は
bool[,] pole = new bool[sizeX, maxY];
ある
、IそれらのX、Y-長さ、およびX-長さ(Yは常に0)を持つ多くのオブジェクトを持ちます。私は、各位置に、オブジェクトタイルがあるかどうかの配列を持っています。
だから私はちょうどcoord X、幅&の高さと位置のタイルを配列に取得します。で、Xは、私は、たとえば10個のオブジェクトを配置する必要があるときに、私は最低のXを取得し(そしてたとえばlargestNegativeX = -999
のためにそれを保存)、負することができ、配列にオブジェクトを配置する前に、私はすべてのオブジェクトのに追加
ポイントX object.X += -largestNegativeX
。次に配列の幅を計算し(例えば2000000000
)、配列を宣言しようとします。例外がスローされます。
[BitArray](https://msdn.microsoft.com/en-us/library/system.collections.bitarray(v = vs.110).aspx)を使用してください。 bool値をビットとして格納し、メモリを消費しません。 –
これはxyの問題のようです。特定のユースケースについて質問すれば、より良い解決策を得ることができます。 – Logarr
ここで辞書を使用しても問題はありません。 –