2012-07-05 23 views
5

मैं सी # में एक 3 डी सरणी का आकार बदलने का प्रयास कर रहा हूं।एक 3 डी सरणी का आकार बदलना

VB6 कोड पढ़ता है:

ReDim Combos(ProductNum, 4, 3) 

जब से मैं एक 3 डी सरणी के लिए Array.Resize उपयोग नहीं कर सकते हैं, वहाँ मेरे लिए एक और तरीका है सी # में इस समारोह करने के लिए है?

मैं पहले से ही एक 3 डी सरणी के रूप में सरणी घोषणा की है:

int[ , , ] Combos; 

लेकिन मैं मुसीबत यह आकार बदलने हो रहा है। कोई विचार?

+0

मैंने ऐरे का उपयोग करने का प्रयास किया है। कॉपी लेकिन यह सुनिश्चित नहीं था कि यह कैसे काम करेगा। –

+0

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

+2

देख वहाँ एक कारण है कि आप एक के बजाय एक सरणी का उपयोग कर रहे है, कहते हैं, सूची ? – RobIII

उत्तर

4

.NET में एक बहुआयामी सरणी को सीधे redimension करने का कोई तरीका नहीं है। मैं एक नई सरणी आवंटित करने की सिफारिश करता हूं, और फिर Array.Copy का उपयोग कर मूल्यों की प्रतिलिपि बनाउंगा।

कहा जा रहा है, तो आप क्या कर रहे हैं पर निर्भर करता है, यदि आप कोई दूसरा संग्रह प्रकार उपयोग करने पर विचार करने के साथ ही कर सकते हैं। संग्रह के मामले में वीबी 6 की तुलना में .NET में और विकल्प हैं, इसलिए कई मामलों जो बहुआयामी सरणी का उपयोग करते हैं, अन्य संग्रह प्रकारों के लिए बेहतर अनुकूल होते हैं, खासकर यदि उनका आकार बदलना है।

+0

पर गड़बड़ कर देगा ".NET में सरणी को सीधे redimension करने का कोई तरीका नहीं है": Array.Resize() के बारे में क्या? http://msdn.microsoft.com/en-us/library/1ffy6686 – Asik

+1

@Dr_Asik यह बहुआयामी सरणियों के साथ काम नहीं करता है -, मैं और अधिक स्पष्ट होना –

+0

Array.Resize संपादित() आंतरिक रूप से नई सरणी आवंटित प्रतियां तत्वों और उस नए सरणी को लौटाता है (ध्यान दें कि रेफ पैरामीटर द्वारा)। – Dusan

4

यहां तक ​​कि एक आयामी सरणी के लिए, सी # में, सरणी काम करता है नई फिर से आकार सरणी में तत्वों को कॉपी करके उसका आकार बदलें।

यदि आपको अक्सर सरणी को फिर से आकार देने की आवश्यकता होती है, तो संग्रह बहुत बेहतर समाधान होगा।

आप अभी भी सरणी आकार बदलने के लिए चाहते हैं, यहाँ कोड है:

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

कोड:

 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

सी # में परीक्षण किया गया (वी.एस. 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(); 
    } 

ठीक काम करने लगता है।

संबंधित मुद्दे