2012-07-05 23 views
5

Estoy intentando redimensionar una matriz 3D en C#.Cambiar el tamaño de una matriz 3D

El código de Visual Basic 6 lee:

ReDim Combos(ProductNum, 4, 3) 

Ya que no puedo usar Array.Resize para una matriz 3D, ¿hay otra manera para mí para hacer esta función en C#?

que ya han declarado la matriz como una matriz 3D:

int[ , , ] Combos; 

pero estoy teniendo problemas para cambiar su tamaño. ¿Algunas ideas?

+0

He intentado usar Array.Copy pero no estaba seguro de cómo funcionaría. –

+0

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

+2

¿Hay alguna razón por la que está usando una matriz en lugar de, por ejemplo, la lista ? – RobIII

Respuesta

4

No hay manera de redimensionar directamente una matriz multidimensional en .NET. Recomendaría asignar una nueva matriz y luego copiar los valores en ella usando Array.Copy.

Dicho esto, dependiendo de lo que esté haciendo, es posible que desee considerar el uso de un tipo de colección diferente, también. Hay más opciones en .NET que VB6 en términos de colecciones, por lo que muchos casos que utilizaron matrices multidimensionales se adaptan mejor a otros tipos de colecciones, especialmente si se les cambia el tamaño.

+0

"No hay forma de redimensionar directamente una matriz en .NET": ¿qué pasa con Array.Resize()? http://msdn.microsoft.com/en-us/library/1ffy6686 – Asik

+1

@Dr_Asik No funciona con matrices multidimensionales - He editado para que sea más claro –

+0

Array.Resize() asigna internamente una nueva matriz, copia los elementos y devuelve esa nueva matriz (tenga en cuenta que por el parámetro ref). – Dusan

4

Incluso para la matriz unidimensional, en C#, el redimensionamiento de la matriz funciona copiando elementos en la nueva matriz de nuevo tamaño.

Si necesita cambiar el tamaño de la matriz a menudo, las colecciones serían una solución mucho mejor.

Si aún desea cambiar el tamaño de la matriz, aquí está el código:

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ódigo:

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

Tomado de: http://www.codeproject.com/Articles/2503/Redhotglue-C-ArrayObject

Probado en C# (VS 2008) con una aplicación de consola:

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(); 
    } 

Parece que funciona bien.