调整3D阵列的大小

时间:2012-07-05 16:19:11

标签: c# visual-studio-2010 vb6 vb6-migration

我正在尝试用C#调整3D数组的大小。

VB6代码为:

ReDim Combos(ProductNum, 4, 3)

由于我不能将Array.Resize用于3D数组,我还有另一种方法可以在C#中执行此功能吗?

我已经将数组声明为3D数组:

int[ , , ] Combos;

但我无法调整大小。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

无法直接在.NET中重新定义多维数组。我建议分配一个新数组,然后使用Array.Copy将值复制到其中。

话虽如此,根据您正在做的事情,您可能还想考虑使用不同的集合类型。在集合方面,.NET中有比VB6更多的选项,因此许多使用多维数组的情况更适合其他集合类型,特别是如果它们将要调整大小。

答案 1 :(得分:4)

即使对于一维数组,在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;
}

答案 2 :(得分:1)

代码:

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

似乎工作正常。

相关问题