我正在尝试在 C# 中调整 3D 数组的大小。
VB6 代码如下:
ReDim Combos(ProductNum, 4, 3)
由于我不能Array.Resize
用于 3D 数组,是否有另一种方法可以在 C# 中执行此功能?
我已经将数组声明为 3D 数组:
int[ , , ] Combos;
但我无法调整它的大小。有任何想法吗?
我正在尝试在 C# 中调整 3D 数组的大小。
VB6 代码如下:
ReDim Combos(ProductNum, 4, 3)
由于我不能Array.Resize
用于 3D 数组,是否有另一种方法可以在 C# 中执行此功能?
我已经将数组声明为 3D 数组:
int[ , , ] Combos;
但我无法调整它的大小。有任何想法吗?
无法在 .NET 中直接重新调整多维数组的大小。我建议分配一个新数组,然后使用Array.Copy
.
话虽如此,根据您所做的事情,您可能还需要考虑使用不同的集合类型。.NET 在集合方面比 VB6 有更多的选择,因此许多使用多维数组的情况更适合其他集合类型,尤其是在它们要调整大小的情况下。
即使对于一维数组,在 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;
}
代码:
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();
}
似乎工作正常。