2012-08-04 12 views
11

जब मैं यह करने के लिए प्रयास करें ...फ़ोरैच लूप के भीतर से फ़ोरैच पुनरावृत्ति चर को कैसे संशोधित करें?

Item[,] array = new Item[w, h]; // Two dimensional array of class Item, 
           // w, h are unknown at compile time. 
foreach(var item in array) 
{ 
    item = new Item(); 
} 

... मैं Cannot assign to 'item' because it is a 'foreach iteration variable' मिलता है।

फिर भी, मैं ऐसा करना चाहता हूं।

विचार मौजूदा आइटम पर डिफ़ॉल्ट Item वर्ग मान असाइन करना है।

+0

आप क्यों नहीं बस एक और चर का उपयोग न? – sczdavos

+0

@sczdavos वास्तव में कैसे? – user1306322

+0

'var myItem; foreach (दोDimArray में var आइटम) myItem = new item(); ' – sczdavos

उत्तर

18

ठीक है, अब है कि हम जानते हैं कि अपने उद्देश्य के बजाय आप कैसे इसे हासिल करने की कोशिश कर रहे थे की, यह बहुत आसान है अपने प्रश्न का उत्तर दें: आपको foreach लूप का उपयोग नहीं करना चाहिए। foreach लगभग संग्रह से आइटम पढ़ रहा है - संग्रह की सामग्री को नहीं बदल रहा है। यह एक अच्छा काम है कि सी # कंपाइलर पुनरावृत्ति परिवर्तनीय रीड-ओनली बनाता है, अन्यथा यह आपको वैरिएबल के मूल्य को बदलने के बिना आपको वास्तव में संग्रह को बदलने के बिना बदल देगा। (वहाँ परिवर्तन दिखाई देने में अनुमति देने के लिए अधिक महत्वपूर्ण परिवर्तन होने के लिए होगा ...)

मुझे लगता है तुम सिर्फ हैं:

for (int i = 0; i < array.GetLength(0); i++) 
{ 
    for (int j = 0; j < array.GetLength(1); j++) 
    { 
     array[i, j] = new Item(); 
    } 
} 

कि यह मानते हुए है एक आयताकार सरणी (एक Item[,]) है। यदि यह एक Item[][] है तो यह सरणियों की एक सरणी है, और आपको लगता है कि संभाल चाहते हैं कुछ अलग ढंग से - बाहरी यात्रा के लिए काफी संभवतः एक foreach साथ:

foreach (var subarray in array) 
{ 
    for (int i = 0; i < subarray.Length; i++) 
    { 
     subarray[i] = new Item(); 
    } 
} 
+0

चलिए देखते हैं कि क्या यह पुराना उत्तर कुछ ध्यान देगा। आपका उत्तर 2-आयामी सरणी के लिए स्पष्ट है लेकिन क्या एन-आयामी सरणी के लिए एक चालाक उत्तर है? – LamdaComplex

+0

@LamdaComplex: ठीक है आप इंडेक्स की एक सरणी बना सकते हैं, और प्रभावी ढंग से वृद्धि कर सकते हैं - या रिकर्सन का उपयोग करें। मेरा सुझाव है कि आप एक नया प्रश्न पूछें, जो आप प्राप्त करने की कोशिश कर रहे हैं उसके संक्षिप्त लेकिन पूर्ण उदाहरण के साथ। –

0

आप इसके लिए लूप के लिए सामान्य उपयोग कर सकते हैं।

for (int i = 0; i < twoDimArray.GetLength(0); i++) 
{ 
    for (int j = 0; j < twoDimArray.GetLength(1); j++) 
    { 
     twoDimArray[i, j] = ... 
    } 
} 
+0

हूं, मुझे आयाम नहीं पता हैं। – user1306322

+0

यह एक द्वि-आयामी सरणी है, तो आप * लंबाई * सही कर सकते हैं? – Adam

+0

फिर अगला क्या है? – user1306322

5

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

किसी दिए गए दो आयामी सरणी के तत्वों को प्रारंभ करने के लिए, इस प्रयास करें:

for (int d = 0; d < array.GetLength(0); d++) 
{ 
    for (int i = 0; i < array.GetLength(1); i++) 
    { 
     array[d, i] = new Item(); 
    } 
} 
2

ऐसा लगता है कि आप सरणी प्रारंभ करने में कोशिश कर रहे हैं:

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