2012-07-05 15 views
5

C#で3D配列のサイズを変更しようとしています。3D配列のサイズ変更

VB6コードを読み取ります

ReDim Combos(ProductNum, 4, 3) 

を私は3DアレイにArray.Resizeを使用することはできませんので、私はC#で、この機能を行うための別の方法は何ですか?

私はすでに3D配列として、配列を宣言している:

int[ , , ] Combos; 

しかし、私は悩み、それをリサイズを持っています。何か案は?

+0

Array.Copyを使用しようとしましたが、どのように動作するかは不明でした。 –

+0

http://stackoverflow.com/questions/6539571/how-to-resize-multidimensional-2d-array-in-c – ken2k

+2

リストの代わりに配列を使用する理由はありますか? – RobIII

答えて

4

多次元配列を.NETで直接次元を変更する方法はありません。私は、新しい配列を割り当てることをお勧めしますし、Array.Copyを使って値をコピーしてください。

あなたがやっていることによっては、別のコレクションタイプを使うことも考えてみてください。 VB6よりもコレクションでVB6より多くのオプションがあります。多次元配列を使用する多くのケースは、特にサイズを変更しようとする場合、他のコレクションタイプに適しています。

+0

".NETで配列を直接次元変更する方法はありません":Array.Resize()はどうでしょうか? http://msdn.microsoft.com/en-us/library/1ffy6686 – Asik

+1

@Dr_Asik多次元配列では機能しません - より明確に編集されました –

+0

Array.Resize()は内部的に新しい配列を割り当て、その新しい配列を返します(refパラメータに注意してください)。 – Dusan

4

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; 
} 
1

コード:での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(); 
    } 

うまく動作するようです。