我正在尝试在C#中调整3D数组的大小。调整3D阵列大小
VB6的代码读取:
ReDim Combos(ProductNum, 4, 3)
既然不能用于三维阵列使用Array.Resize
,有另一种方式为我做的在C#中这个功能呢?
我已宣布将数组作为3D阵列:
int[ , , ] Combos;
但我无法调整其大小。有任何想法吗?
我正在尝试在C#中调整3D数组的大小。调整3D阵列大小
VB6的代码读取:
ReDim Combos(ProductNum, 4, 3)
既然不能用于三维阵列使用Array.Resize
,有另一种方式为我做的在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();
}
似乎工作正常。
我试图使用Array.Copy,但不确定它是如何工作的。 – 2012-07-05 16:19:32
请参阅http://stackoverflow.com/questions/6539571/how-to-resize-multidimensional-2d-array-in-c – ken2k 2012-07-05 16:24:06
有没有原因,你为什么使用数组而不是列表? –
RobIII
2012-07-05 16:24:33