C# で 3D 配列のサイズを変更しようとしています。
VB6 コードは次のようになります。
ReDim Combos(ProductNum, 4, 3)
3D 配列を使用できないためArray.Resize
、C# でこの関数を実行する別の方法はありますか?
配列を 3D 配列として既に宣言しています。
int[ , , ] Combos;
しかし、私はそれをサイズ変更するのに苦労しています。何か案は?
C# で 3D 配列のサイズを変更しようとしています。
VB6 コードは次のようになります。
ReDim Combos(ProductNum, 4, 3)
3D 配列を使用できないためArray.Resize
、C# でこの関数を実行する別の方法はありますか?
配列を 3D 配列として既に宣言しています。
int[ , , ] Combos;
しかし、私はそれをサイズ変更するのに苦労しています。何か案は?
1 次元配列の場合でも、C# では、配列のサイズ変更は、要素をサイズ変更された新しい配列にコピーすることによって機能します。
配列のサイズを頻繁に変更する必要がある場合は、コレクションの方がはるかに優れたソリューションです。
それでも配列のサイズを変更したい場合は、コードは次のとおりです。
T[,,] ResizeArray<T>(T[,,] original, int xSize, int ySize, int zSize)
{
var newArray = new T[xSize, ySize, zSize];
var xMin = Math.Min(xSize, original.GetLength(0));
var yMin = Math.Min(ySize, original.GetLength(1));
var zMin = Math.Min(zSize, original.GetLength(2));
for (var x = 0; x < xMin; x++)
for (var y = 0; y < yMin; y++)
for (var z = 0; z < zMin; z++)
newArray[x, y, z] = original[x, y, z];
return newArray;
}
.NET で多次元配列を直接再次元化する方法はありません。新しい配列を割り当ててから、 を使用して値をコピーすることをお勧めしArray.Copy
ます。
そうは言っても、何をしているかによっては、別のコレクション タイプの使用を検討することもできます。コレクションに関しては、VB6 よりも .NET の方が多くのオプションがあるため、多次元配列を使用する多くの場合、特にサイズを変更する場合は、他のコレクション タイプに適しています。
コード:
public int[,,] ReDimension(int[,,] OldArray,int arr1stDimLength,int arr2ndDimLength,int arr3rdDimLength)
{
// declare a larger array
int[,,] NewArray = new int[arr1stDimLength,arr2ndDimLength,arr3rdDimLength];
// determine if we are shrinking or enlarging
const int FirstDimension = 0;
const int SecondDimension = 1;
const int ThirdDimension = 2;
int xMax = 0;
int yMax = 0;
int zMax = 0;
// determine if we are shrinking or enlarging columns
if (OldArray.GetUpperBound(FirstDimension) < (arr1stDimLength - 1))
xMax = OldArray.GetUpperBound(FirstDimension) + 1;
else
xMax = arr1stDimLength;
// determine if we are shrinking or enlarging rows
if (OldArray.GetUpperBound(SecondDimension) < (arr2ndDimLength - 1))
yMax = OldArray.GetUpperBound(SecondDimension) + 1;
else
yMax = arr2ndDimLength;
// determine if we are shrinking or enlarging depth
if (OldArray.GetUpperBound(ThirdDimension) < (arr3rdDimLength - 1))
zMax = OldArray.GetUpperBound(ThirdDimension) + 1;
else
zMax = arr3rdDimLength;
// place values of old array into new array
for(int z = 0; z < zMax; z++)
{
for(int x = 0; x < xMax; x++)
{
for(int y = 0; y < yMax; y++)
{
NewArray[x, y, z] = OldArray[x, y, z];
Console.Write("[{0}]", NewArray[x, y, z]);
}
Console.Write("\n");
}
Console.Write("\n\n");
}
return NewArray;
}
取得元:http ://www.codeproject.com/Articles/2503/Redhotglue-C-ArrayObject
コンソールアプリを使用してC#(VS 2008)でテスト済み:
static void Main(string[] args)
{
int[, ,] combos = new int[1,2,3];
Console.WriteLine("Combos size: {0}",combos.Length.ToString());
combos = ReDimension(combos, 5, 5, 5);
Console.WriteLine("New Combos size: {0}", combos.Length.ToString());
Console.ReadKey();
}
正常に動作しているようです。