2011-01-10 18 views
40
  1. जालीदार सरणी और बहुआयामी सरणी के बीच क्या अंतर है। क्या किसी का एक फायदा है?हमारे पास दोनों जंजीर सरणी और बहुआयामी सरणी क्यों है?

  2. और क्यों दृश्य स्टूडियो मुझे ऐसा करने की अनुमति नहीं होगी एक

    MyClass[][] abc = new MyClass[10][20]; 
    

    (हम .. लाल wriggly लाइन के साथ कि सी ++ में है, लेकिन सी # में यह रेखांकित करता है [20] करते थे अवैध रैंक कहते हैं विनिर्देशक)

    लेकिन

    MyClass[,] abc = new MyClass[10,20]; 
    
  3. अंत के साथ खुश है कि कैसे मैं एक पंक्ति में इस को प्रारंभ कर सकते हैं (जैसे हमके साथ सरल सरणी में क्या)

    MyClass[][,][,] itemscollection; 
    
+6

एक जालीदार सरणी का पूरा बिंदु यह है कि "नेस्टेड" सरणी एक समान आकार की नहीं होनी चाहिए। – Ani

+1

http://msdn.microsoft.com/en-us/library/2yd9wwz4(v=vs.71).aspx - [X, Y] के रूप में बहुआयामी सरणी वाक्य रचना डॉक्स – ndtreviv

+0

अतिरिक्त उप प्रश्न के अनुसार मान्य है: यह है बहु-आयामी सरणी के साथ foreach() का उपयोग करने के लिए संभव है? –

उत्तर

51
  1. एक दांतेदार सरणी एक सरणी के-सरणियों, इसलिए एक int[][]int[] की एक सरणी, जिनमें से प्रत्येक अलग-अलग लंबाई की हो सकता है और स्मृति में अपने स्वयं के ब्लॉक में स्थान ले सकते हैं है। एक बहुआयामी सरणी (int[,]) स्मृति का एक ब्लॉक है (अनिवार्य रूप से एक मैट्रिक्स)।

  2. आप नहीं एक MyClass[10][20] क्योंकि प्रत्येक उप सरणी अलग से प्रारंभ करने के लिए, के रूप में वे अलग वस्तुओं रहे है बना सकते हैं:

    MyClass[][] abc = new MyClass[10][]; 
    
    for (int i=0; i<abc.Length; i++) { 
        abc[i] = new MyClass[20]; 
    } 
    

    क्योंकि यह एक मैट्रिक्स के रूप में एक वस्तु आरंभ कर रहा है एक MyClass[10,20] ठीक है के साथ 10 पंक्तियों और 20 कॉलम

  3. एक MyClass[][,][,] तो जैसे initailized किया जा सकता है (हालांकि परीक्षण किया संकलन नहीं):

    MyClass[][,][,] abc = new MyClass[10][,][,]; 
    
    for (int i=0; i<abc.Length; i++) { 
        abc[i] = new MyClass[20,30][,]; 
    
        for (int j=0; j<abc[i].GetLength(0); j++) { 
         for (int k=0; k<abc[i].GetLength(1); k++) { 
          abc[i][j,k] = new MyClass[40,50]; 
         } 
        } 
    } 
    

ध्यान रखें कि सीएलआर को सिंगल-आयाम सरणी पहुंच के लिए अत्यधिक अनुकूलित किया गया है, इसलिए एक जंजीर सरणी का उपयोग करना एक ही आकार की बहुआयामी सरणी से तेज होगा।

+3

क्या आप हमें कुछ सबूत बता सकते हैं कि सिंगल आयामी सरणी का उपयोग तेजी से होता है? – GreyCloud

+5

@ ग्रेक्लाउड - http://stackoverflow.com/questions/597720/what-is-differences-between-multidimensional-array-and-array-of-arrays-in-c – thecoop

+0

क्या वहां (सामान्य) उपयोग केस है बहु आयामी सरणी? – ryanwebjackson

22

एक दांतेदार सरणी सरणियों की एक सरणी है। प्रत्येक सरणी एक ही आकार के होने की गारंटी नहीं है। आप

int[][] jaggedArray = new int[5][]; 
jaggedArray[0] = { 1, 2, 3 }; // 3 item array 
jaggedArray[1] = new int[10]; // 10 item array 
// etc. 

हो सकता था यह एक सेट संबंधित सरणियों के है।

दूसरी तरफ एक बहुआयामी सरणी एक समेकित समूह है, जैसे बॉक्स, टेबल, घन इत्यादि, जहां कोई अनियमित लंबाई नहीं है। यही कारण है कि कहने के लिए

int i = array[1,10]; 
int j = array[2,10]; // 10 will be available at 2 if available at 1 
+0

सीधे बिंदु पर। बहुत बढ़िया जवाब। +1 – wassimans

+0

मैंने आपके कोड की कोशिश की। यह संकलित नहीं किया था। Int जोड़ने की कोशिश करें [3] तो कोशिश करें 'jaggedArray [0] = int [3] {1, 2, 3} '; – barlop

+0

मुझे पता है कि यह पुराना है, लेकिन सिर्फ जानकारी के लिए int [3] उपलब्ध नहीं है। एक साधारण int [] सब कुछ मायने रखता है। int [] [] myArray = नया int [5] []; myArray [0] = नया int [] {1, 2, 3, 4}; यह सब कुछ है जो निरंतर है। – Velocibadgery

6

एक आयताकार सरणी में हमेशा प्रत्येक पंक्ति के लिए समान मात्रा में कॉलम होते हैं।

MyClass[,] x = new MyClass[10,30] 

प्रत्येक पंक्ति में 30 कॉलम होते हैं, जबकि एक जंजीर सरणी में, यह आवश्यक नहीं है। इसलिए, मुझे लगता है कि आप अलग से एक दांतेदार सरणी में हर 'पंक्ति' को प्रारंभ करना होगा:

MyClass[][] x = new MyClass[10][]; 

for(int i = 0; i < 10; i++) 
{ 
    x[i] = new MyClass[30]; 
} 

वास्तव में, इसका मतलब है कि दांतेदार सरणी में नहीं हर पंक्ति तत्वों की एक ही नंबर होना चाहिए। (मेरे उदाहरण में, इसमें तत्वों की संख्या समान है, लेकिन इसकी आवश्यकता नहीं है)।

आप पूरी तरह से उदाहरण के लिए ऐसा कर सकते हैं,:

MyClass[][] x = new MyClass[10][]; 

for(int i = 0; i < 10; i++) 
{ 
    x[i] = new MyClass[(30 + i)]; 
} 

This आप के लिए एक दिलचस्प लेख हो सकता है।

1

आप एक बहु-आयामी सरणी सीमा निर्धारित की है कि के लिए देख रहे हैं, हमेशा [,] शैली वाक्य रचना का उपयोग करते हैं। यह सुनिश्चित करेगा कि प्रत्येक भाग बराबर आकार में है।

आप [][] का उपयोग करते हैं कि वास्तव में क्या हो रहा है कि आप सरणियों की एक सरणी बना रहे है। इसका मतलब है कि प्रत्येक सरणी को अलग-अलग आकार दिया जा सकता है। उदाहरण के लिए:

int[][] jaggedArray = new int[5][] 
for(int index = 0; index < jaggedArray.Length ; ++index) 
{ 
    jaggedArray[index] = new int[index + 1]; 
} 
1

इनलाइन घोषणा कुछ इस तरह दिखेगा:

int[,] numbers = { {1, 2}, {3, 4}, {5, 6} }; 
1

# 1 के लिए, देखें this SO question

दांतेदार या बहुआयामी इनलाइन सरणियों के लिए, यह programming guide देखें:

// Three-dimensional array. 
int[, ,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } }; 
// Same array with dimensions specified. 
int[, ,] array3Da = new int[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } }; 

आपको dimen निर्दिष्ट करने की आवश्यकता नहीं है sions (array3D), लेकिन यदि आप जानते हैं कि वे कभी भी बदलने जा रहे हैं, तो यह जानना उपयोगी है कि आप किस आयाम का उपयोग कर रहे हैं (array3Da)।

0

आपको सरणी बहु-आयामी सरणी कार्य को एकल आयाम सरणी के रूप में आंतरिक कार्य को समझने की आवश्यकता होगी सिवाय इसके कि डबल इंडेक्सिंग को एक में परिवर्तित किया जाता है।

सी # में आपका दांतेदार सरणी जिन वस्तुओं पर कर रहे हैं सरणियों बदल जाता है की एक सरणी है।

3

विज्ञापन 3) [][,][,] की तरह इस तरह के एक राक्षस को प्रारंभ करने के लिए, जैसे आप sth कर सकते हैं:

 int [,][,] multiArr1 = { { new int[,] { { 2, 2 }, { 1, 1 } }, 
            new int[,] { { 2, 2 }, { 1, 1 } } }, 
            { new int[,] { { 2, 2 }, { 1, 1 } }, 
             new int[,] { { 2, 2 }, { 1, 1 } } } }; 
     int [,][,] multiArr2 = { { new int[,] { { 2, 2 }, { 1, 1 } }, 
            new int[,] { { 2, 2 }, { 1, 1 } } }, 
            { new int[,] { { 2, 2 }, { 1, 1 } }, 
             new int[,] { { 2, 2 }, { 1, 1 } } } }; 

     int [][,][,] superMultiArray = { multiArr1, multiArr2 }; 
0

मुझे लगता है कि सी # में 2 डी दांतेदार सरणियों स्मृति आवंटन सी में 2 डी सरणियों की तरह है कि ++ और सी क्योंकि 2 डी जंजीर सरणी में पॉइंटर होता है जो पॉइंटर्स की सरणी को इंगित करता है कि इनमें से प्रत्येक पॉइंटर्स तत्वों की एक सरणी को इंगित करता है (उदाहरण के लिए पूर्णांक तत्व); सी ++ में इस कोड, जैसे

int** 2DArr {new int* [number1]}; 
for (int i = 0; i < number1; i++) 
{ 
    2DArr[i] = new int[number2]; 
} 

कोड bellow की स्मृति आवंटन सी # में 2 डी दांतेदार सरणियों के समान है। लेकिन मैं इस बारे में संदिग्ध हूं, अगर आप गलत तरीके से सोचते हैं तो क्या आप और अधिक समझा सकते हैं।

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