C#で3D配列のサイズを変更しようとしています。3D配列のサイズ変更
VB6コードを読み取ります
ReDim Combos(ProductNum, 4, 3)
を私は3DアレイにArray.Resize
を使用することはできませんので、私はC#で、この機能を行うための別の方法は何ですか?
私はすでに3D配列として、配列を宣言している:
int[ , , ] Combos;
しかし、私は悩み、それをリサイズを持っています。何か案は?
C#で3D配列のサイズを変更しようとしています。3D配列のサイズ変更
VB6コードを読み取ります
ReDim Combos(ProductNum, 4, 3)
を私は3DアレイにArray.Resize
を使用することはできませんので、私はC#で、この機能を行うための別の方法は何ですか?
私はすでに3D配列として、配列を宣言している:
int[ , , ] Combos;
しかし、私は悩み、それをリサイズを持っています。何か案は?
多次元配列を.NETで直接次元を変更する方法はありません。私は、新しい配列を割り当てることをお勧めしますし、Array.Copy
を使って値をコピーしてください。
あなたがやっていることによっては、別のコレクションタイプを使うことも考えてみてください。 VB6よりもコレクションでVB6より多くのオプションがあります。多次元配列を使用する多くのケースは、特にサイズを変更しようとする場合、他のコレクションタイプに適しています。
C#では、1次元配列の場合でも、配列のサイズ変更は、要素を新しいサイズの新しい配列にコピーすることによって機能します。
頻繁にサイズを変更する必要がある場合は、コレクションがはるかに良い解決策になります。
それでも、配列のサイズを変更したい場合は、ここではコードです:
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;
}
コード:でのC#(VS 2008)でテストhttp://www.codeproject.com/Articles/2503/Redhotglue-C-ArrayObject
:から撮影
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;
}
は、コンソールアプリ:
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();
}
うまく動作するようです。
Array.Copyを使用しようとしましたが、どのように動作するかは不明でした。 –
http://stackoverflow.com/questions/6539571/how-to-resize-multidimensional-2d-array-in-c – ken2k
リストの代わりに配列を使用する理由はありますか? –
RobIII