整数値の2次元配列を-1で初期化しようとしています。新しい配列を作成すると、自動的に0で埋められます。2サイクルで実行できることはわかっていますが、配列の構築中にこれを実行する方法があるはずです(したがって、そうする必要はありません)。 2回実行します)。0の代わりに、指定された値が挿入されます。出来ますか?アレイの最初の構築中でない場合、他の時間やコードを節約する方法はありますか、それとも2サイクルで立ち往生していますか?
3 に答える
次のようなものを試してください。int[,] array2D = new int[,] { { -1 }, { -1 }, { -1 }, { -1} };
または寸法付きint[,] array2D = new int[4,2] { { -1,-1 }, { -1,-1 }, { -1,-1 }, {-1,-1} };
多次元配列では、配列がコードで直接初期化できるほど小さい場合を除いて、ループが最善のアプローチである可能性があります。
ジャグ配列を使用している場合は、最初のサブ配列を初期化してから、Array.Copyを使用してこれらの値を他のサブ配列にコピーできます。これには、最初のサブ配列を1回繰り返し、N-1個の外部配列を1回ループする必要がありますが、コピー操作はループよりも高速です。
Pythonでは、この種の2D配列の初期化は間違っています。
mat = [[0] * 5] * 5 # wrong
mat = [[0] * 5] for _ in range(5)] # correct
内部配列の参照を複数回コピーしていて、そのうちの1つを変更すると、最終的にすべてが変更されるためです。
mat[0][0] = 1
print(mat)
# 1 0 0 0 0
# 1 0 0 0 0
# 1 0 0 0 0
# 1 0 0 0 0
# 1 0 0 0 0
C#でも同様の問題があります。
var mat = Enumerable.Repeat(Enumerable.Repeat(0, 5).ToArray(), 5).ToArray();
配列は参照型であるため、外部のRepeat()は実際には内部の配列の参照をコピーしています。
次に、forループを使用せずに多次元配列を作成して初期化する必要がある場合は、カスタムヘルパークラスが役立つ可能性があります。
static class HelperFunctions
{
public static T[][] Repeat<T>(this T[] arr, int count)
{
var res = new T[count][];
for (int i = 0; i < count; i++)
{
//arr.CopyTo(res[i], 0);
res[i] = (T[])arr.Clone();
}
return res;
}
}
次に、それを使用したい場合:
using static HelperFunctions;
var mat = Enumerable.Repeat(0, 5).ToArray().Repeat(5);
これで十分です。