2012-07-05 45 views
5

Tôi đang cố định lại kích thước một mảng 3D trong C#.Thay đổi kích thước mảng 3D

Mã VB6 đọc:

ReDim Combos(ProductNum, 4, 3) 

Vì tôi không thể sử dụng Array.Resize cho một mảng 3D, là có một cách khác cho tôi làm chức năng này trong C#?

Tôi đã tuyên bố mảng như một mảng 3D:

int[ , , ] Combos; 

Nhưng tôi đang gặp khó khăn thay đổi kích thước nó. Bất kỳ ý tưởng?

+0

Tôi đã cố gắng sử dụng Array.Copy nhưng không chắc chắn về cách thức hoạt động của nó. –

+0

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

+2

Có lý do nào khiến bạn sử dụng Mảng thay vì một, ví dụ: Danh sách không? – RobIII

Trả lời

4

Không có cách nào để trực tiếp tạo lại một mảng đa chiều trong .NET. Tôi sẽ khuyên bạn nên phân bổ một mảng mới, và sau đó sao chép các giá trị vào nó bằng cách sử dụng Array.Copy.

Điều đó đang được nói, tùy thuộc vào những gì bạn đang làm, bạn cũng có thể cân nhắc sử dụng một loại bộ sưu tập khác. Có nhiều tùy chọn trong .NET hơn VB6 về bộ sưu tập, vì vậy nhiều trường hợp sử dụng mảng đa chiều phù hợp hơn với các loại bộ sưu tập khác, đặc biệt nếu chúng được thay đổi kích thước.

+0

"Không có cách nào để trực tiếp redimension một mảng trong. NET": những gì về Array.Resize()? http://msdn.microsoft.com/en-us/library/1ffy6686 – Asik

+1

@Dr_Asik Nó không hoạt động với các mảng đa chiều - Tôi đã chỉnh sửa để rõ ràng hơn –

+0

Array.Resize() phân bổ nội bộ mảng mới, sao chép các phần tử và trả về mảng mới đó (lưu ý rằng theo tham số ref). – Dusan

4

Ngay cả đối với mảng một chiều, trong C#, việc thay đổi kích thước mảng hoạt động bằng cách sao chép các phần tử thành mảng có kích thước lại mới.

Nếu bạn cần phải tái kích thước mảng thường xuyên, các bộ sưu tập sẽ là giải pháp tốt hơn nhiều.

Nếu bạn vẫn muốn thay đổi kích thước mảng, đây là mã:

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

Code:

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

Trích từ: http://www.codeproject.com/Articles/2503/Redhotglue-C-ArrayObject

Tested trong C# (VS 2008) với một ứng dụng bảng điều khiển:

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

Dường như hoạt động tốt.

Các vấn đề liên quan