5

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

VB6 代码如下:

ReDim Combos(ProductNum, 4, 3)

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

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

int[ , , ] Combos;

但我无法调整它的大小。有任何想法吗?

4

3 回答 3

4

无法在 .NET 中直接重新调整多维数组的大小。我建议分配一个新数组,然后使用Array.Copy.

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

于 2012-07-05T16:25:09.440 回答
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;
}
于 2012-07-05T16:29:00.557 回答
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();
    }

似乎工作正常。

于 2012-07-05T16:37:51.467 回答