क्यों हम दोनों दांतेदार सरणी और बहुआयामी सरणी है?


87
  1. दांतेदार सरणी और बहुआयामी सरणी के बीच अंतर क्या है। क्या एक का दूसरे पर लाभ है?

  2. और विज़ुअल स्टूडियो मुझे ए की अनुमति क्यों नहीं देगा

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

    (हम ऐसा C ++ में करते थे, लेकिन C # में यह रेखांकित करता है [20] लाल अस्पष्ट रेखा के साथ .. अमान्य रैंक निर्दिष्ट करता है)

    लेकिन खुश है

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

    MyClass[][,][,] itemscollection;
    

11
एक दांतेदार सरणी का पूरा बिंदु यह है कि "नेस्टेड" सरणियों को एक समान आकार की आवश्यकता नहीं है।
ऐनी

1
msdn.microsoft.com/en-us/library/2yd9wwz4(v=vs.71).aspx - बहुआयामी सरणी सिंटैक्स को [X, Y] डॉक्स के अनुसार मान्य है
ndtreviv

अतिरिक्त उप-प्रश्न: क्या बहुआयामी सरणी के साथ फॉरच () का उपयोग करना संभव है?
सर्ज वेटियर

@ सर्ज - बेशक, Arrayऔजार के रूप में IEnumerable। आप इसे हमेशा आजमा सकते हैं और खुद देख सकते हैं :)
thecoop

जवाबों:


101
  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. A MyClass[][,][,]को इस तरह आरंभीकृत किया जा सकता है (हालांकि संकलित परीक्षण नहीं):

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

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


6
क्या आप हमें कुछ प्रमाणों की ओर संकेत कर सकते हैं कि एकल आयामी सरणी एक्सेस तेज़ हैं?
ग्रेक्लाउड


क्या बहु-आयामी सरणी के लिए एक (आम) उपयोग मामला है?
ryanwebjackson

1
उदाहरण: चेक्ड बोर्ड var board = new Piece[8, 8];, एक परिवर्तन मैट्रिक्स var m = new double[2, 2];
ओलिवियर जैकोट-डेसकोम्बर्स 15

37

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

int[][] jaggedArray = new int[5][];
jaggedArray[0] = new[] {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

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

मुझे पता है कि यह पुराना है, लेकिन सिर्फ सूचनात्मक उद्देश्य के लिए int [3] neccessary नहीं है। एक साधारण int [] यह सब मायने रखता है। int [] [] myArray = नया int [५] []; myArray [0] = नया int [] {1, 2, 3, 4}; यह वह सब है जो निरर्थक है।
वेलोसिबडगरी

क्या आप इसे C # में संकलित कर सकते हैं? jaggedArray[0] = { 1, 2, 3 };जब तक मैं इसे = new[] { 1, 2, 3 }(या = new int[] { 1, 2, 3 }C # 3.0 से पहले) नहीं बदल देता, मैं संकलन नहीं कर सकता । Microsoft के C # प्रोग्रामिंग गाइड के अनुसार , "आप इसे बनाए बिना एक ऐरे वेरिएबल की घोषणा कर सकते हैं, लेकिन जब आप इस वेरिएबल को एक नया एरे असाइन करते हैं तो आपको नए ऑपरेटर का उपयोग करना होगा।"
जोएल वी। बयाना-डींगौंग

11

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

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

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


5

विज्ञापन 3) इस तरह के एक राक्षस को शुरू करने के लिए [][,][,], आप कुछ ऐसा कर सकते हैं:

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

1

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

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

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


1

# 1 के लिए, यह SO प्रश्न देखें

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

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

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

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


0

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

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


0

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

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

कोड बलो की मेमोरी एलोकेशन C # में 2d दांतेदार सरणियों के समान है। लेकिन मुझे इस बारे में संदेह है, अगर आप गलत तरीके से सोचते हैं तो क्या आप अधिक बता सकते हैं।


0

यह पोस्ट पुरानी है लेकिन यहाँ उस पर मेरे विचार हैं।

दांतेदार सरणियाँ बहुआयामी सरणियाँ हैं। बहुआयामी सरणियाँ दो किस्मों में आती हैं: आयताकार और दांतेदार। आयताकार सरणियाँ स्मृति के एक n- आयामी ब्लॉक का प्रतिनिधित्व करती हैं, और दांतेदार सरणियों को सरणियों के सारणी हैं।

आयताकार सरणियाँ

आयताकार सरणियों को प्रत्येक आयाम को अलग करने के लिए अल्पविराम का उपयोग करके घोषित किया जाता है। निम्नलिखित कथन एक आयताकार द्वि-आयामी सरणी घोषित करता है, जहाँ आयाम 3 × 3 हैं:

int[,] matrix = new int [3, 3]; 

दांतेदार गिरफ्तारी

प्रत्येक आयाम का प्रतिनिधित्व करने के लिए क्रमिक वर्ग कोष्ठकों का उपयोग करते हुए दांतेदार ऐरे को घोषित किया जाता है। यहाँ एक दांतेदार द्वि-आयामी सरणी घोषित करने का एक उदाहरण है, जहाँ सबसे बाहरी आयाम 3 है:

int[][] matrix = new int[3][];

0

एक बहु-आयामी सरणी के लिए एक बॉक्स या आयत के बारे में सोचें। प्रत्येक पंक्ति समान लंबाई है और प्रत्येक स्तंभ समान लंबाई है।

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

अब मैंने इस उदाहरण के लिए 2 आयामों / 2 सरणियों का उपयोग किया, लेकिन यह अधिक पर लागू होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.