2010-03-16 12 views
6

अपने प्रोजेक्ट में मैं इस तरह कोड का एक बहुत कुछ है:गतिशील रूप से बनाई गई दांतेदार आयताकार सरणी

int[][] a = new int[firstDimension][]; 
for (int i=0; i<firstDimension; i++) 
{ 
    a[i] = new int[secondDimension]; 
} 

तत्वों के प्रकार अलग हैं।

वहाँ

createArray(typeof(int), firstDimension, secondDimension); 

की तरह एक विधि लेखन और new int[firstDimension][secondDimension] होने का कोई रास्ता नहीं है?

एक बार फिर, तत्वों के प्रकार के केवल कार्यावधि में जाना जाता है।

उत्तर

6

जेनेरिक्स चाल करना चाहिए:

static T[][] CreateArray<T>(int rows, int cols) 
{ 
    T[][] array = new T[rows][]; 
    for (int i = 0; i < array.GetLength(0); i++) 
     array[i] = new T[cols]; 

    return array; 
} 

आप प्रकार जब स्पष्ट करना पड़ता है

char[][] data = CreateArray<char>(10, 20); 
+0

धन्यवाद, यह मेरे लिए एक बड़ा मदद है, लेकिन वह एक मौजूदा परियोजना में एक विशाल पुनर्रचना की आवश्यकता होगी। प्रारंभ करने के बाद, सरणी केवल जंजीर सरणी के रूप में उपयोग की जाती है। – GaGar1n

+0

क्या आप रिफैक्टरिंग की व्याख्या कर सकते हैं? मैंने 'var' संपादित किया, लेकिन यह सिर्फ नोटेशन था। –

+0

ठीक है, मैं 'रनटाइम' पर गलत पढ़ता हूं। इसका मतलब होगा @pete का एक बेहतर जवाब है। –

1

वैसे आप यह कर सकते हैं:

int[,] array = new int[4,2]; 

क्या आप एक बहुआयामी सरणी (4x2) कहा जाता है। Here बहुआयामी सरणी के बारे में एक अच्छा लेख है।

अवधि दांतेदार सरणी आमतौर पर सरणियों, विभिन्न दूसरा आयाम है को दर्शाता है। उदाहरण के लिए ले:

int[][] jagged = new int[2][]; 
jagged[0] = new int[5]; // 5 elements 
jagged[1] = new int[1]; // 1 element 

तो यह एक 2x5 सरणी नहीं है, लेकिन एक दांतेदार सरणी ..

+0

कि बहुत आसान होती है :) लेकिन मैं एक सरणियों के रूप में दूसरे आयामों का उपयोग करने के लिए, उदाहरण के लिए की जरूरत है। – GaGar1n

0

Mosa उल्लेख किया है, अगर आप आयताकार दांतेदार सरणी चाहते हैं, तो आप एक mul का उपयोग कर बेहतर कर रहे हैं: इस बुला टीआई-आयामी सरणी।

int[,] array = new int[dimension, dimension2]; 

एक आयताकार सरणी उत्पन्न करेगा।

कारण एक दांतेदार सरणी का उपयोग करने के लिए, आप विभिन्न द्वितीयक आयामों के साथ एक सरणी बनाने के लिए चाहते हैं। एक जंजीर सरणी वास्तव में सरणी की एक सरणी है, जहां एक बहु-आयामी सरणी थोड़ा अलग जानवर है।

+0

एक जंजीर सरणी तेज है। –

+0

हू, जिसे मैं नहीं जानता था। हालांकि मुझे आश्चर्य नहीं है। –

1

हैं:

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

आप Array.CreateInstance कुछ की तरह उपयोग कर सकते हैं:

static Array CreateArray (Type t, int rows, int cols) 
{ 

    Array arr = Array.CreateInstance (typeof(Array), rows); 
    for (int i = 0; i < rows; rows++) { 
     arr.SetValue (Array.CreateInstance(t, cols), i); 
    } 

    return arr; 
} 

लेकिन आप कर रहे हैं यकीन आप इस के लिए गतिशील प्रकार से कार्यावधि में की ज़रूरत है? int [] एक = सरणी [3], जो मैं बहुआयामी सरणी के साथ ऐसा नहीं कर सकते:

+0

धन्यवाद, यह भी कोशिश की। वैसे, एक त्रुटि है - 'Array arr = Array.CreateInstance (Array, पंक्तियां) होना चाहिए' मुझे लगता है :) समस्या यह थी कि मैं arr [i] [k] जैसे तत्वों का उल्लेख नहीं कर सका । टाइप करने के लिए कास्टिंग [] [] भी काम नहीं किया। वास्तव में, आप सही हैं, मैं गतिशील प्रकारों के बारे में भूल सकता हूं और जेनेरिक का उपयोग कर सकता हूं। – GaGar1n

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