2013-07-16 8 views
10

एक जगह में मैं उस मामले में स्ट्रिंग की सूची का उपयोग कर रहा मैं स्ट्रिंग का मूल्य बदल करने में सक्षम हूँ के रूप में कोड नीचे दिए गए,फ़ोरैच लूप में ऑब्जेक्ट्स वैल्यू बदलना?

foreach(string item in itemlist.ToList()) 
{ 
    item=someValue; //I am able to do this 
} 

लेकिन वर्ग की वस्तु के लिए मैं बदल नहीं पा रहा हूँ वस्तु कोड के रूप में नीचे है के सदस्यों मूल्य,

public class StudentDTO 
{ 
    string name; 
    int rollNo; 
} 

studentDTOList=GetDataFromDatabase(); 

foreach(StudentDTO student in studentDTOList.ToList()) 
{ 
     studentDTO=ChangeName(studentDTO); //Not working 
} 

private StudentDTO ChangeName(StudentDTO studentDTO) 
{ 
    studentDTO.name=SomeName; 
    return studentDTO; 
} 

त्रुटि है: यह इसलिए है क्योंकि आवंटित नहीं किया जा सकता यात्रा चर

+9

नहीं, आप वास्तव में पहले स्निपेट में कोड करने में सक्षम नहीं हैं। पुनरावृत्ति चर केवल पढ़ने के लिए है। –

+0

मैं .olist() की प्रतिलिपि बनाने और उस प्रतिलिपि के माध्यम से पुनरावृत्ति करने के कारण ऐसा करने में सक्षम हूं, इसलिए यह –

+0

काम कर रहा है, नहीं, आप ऐसा करने में सक्षम नहीं हैं। कर के देखो। कोड * संकलित नहीं होगा *। यदि आप वास्तव में विश्वास करते हैं, तो कृपया एक छोटा लेकिन पूरा कार्यक्रम तैयार करें जो प्रदर्शित करता है - आप देखेंगे कि यह विफल रहता है। –

उत्तर

16

आप फ़ोरैच-लूप के पुनरावृत्ति चर को नहीं बदल सकते हैं, लेकिन आप पुनरावृत्ति चर के सदस्यों को बदल सकते हैं। इसलिए करने के लिए

private void ChangeName(StudentDTO studentDTO) 
{ 
    studentDTO.name = SomeName; 
} 

ध्यान दें कि studentDTO एक संदर्भ प्रकार है ChangeName विधि बदल जाते हैं। इसलिए बदले गए छात्र को वापस करने की कोई जरूरत नहीं है। ChangeName विधि क्या होती है, छात्र की प्रति नहीं है बल्कि अद्वितीय छात्र वस्तु का संदर्भ है। पुनरावृत्ति चर और studentDTOList दोनों एक ही छात्र वस्तु को संदर्भित करते हैं जैसे विधि के studentDTO पैरामीटर।

और

foreach(StudentDTO student in studentDTOList) 
{ 
    ChangeName(student); 
} 

हालांकि करने के लिए लूप को बदलने, ChangeName तरह के तरीकों असामान्य हैं। जाने का रास्ता एक संपत्ति में क्षेत्र संपुटित करने

private string name; 
public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 

फिर आप

foreach(StudentDTO student in studentDTOList) 
{ 
    student.Name = SomeName; 
} 

संपादित

के लिए लूप को बदल सकते हैं एक टिप्पणी में आप कहते हैं कि तुम है कई क्षेत्रों को बदलना है। उस स्थिति में UpdateStudent एक विधि होना ठीक होगा जो सभी परिवर्तन करेगा; हालांकि मैं अभी भी गुण रखता हूं।

यदि मूल्य के माध्यम से गुजरने के अलावा गुणों में कोई अतिरिक्त तर्क नहीं है, तो आप उन्हें आसान ऑटो-कार्यान्वित गुणों से प्रतिस्थापित कर सकते हैं।

public string Name { get; set; } 

उस स्थिति में आपको फ़ील्ड name छोड़ना होगा।

+0

यानी मैंने धन्यवाद किया है कि पहले से ही मैं इसे प्रश्न में उल्लेख करना भूल गया हूं ... –

+1

इसलिए मुझे फ़ंक्शन से कुछ भी वापस नहीं करना है क्योंकि इसे पहले से ही तर्क का संदर्भ प्रकार –

+1

हां है। यहां तक ​​कि यदि आप छात्र को वापस लौटते हैं, तो आप रिटर्न वैल्यू को सुरक्षित रूप से अनदेखा कर सकते हैं और इसे पुनरावृत्ति चर को असाइन नहीं कर सकते हैं। छात्र लौटने से आपको विधि कॉल करने की अनुमति मिलती है: 'student.UpdateValues ​​()। StoreChanges()। PrintReport();' –

17

आप वास्तव में उद्देश्य यह है कि आप किसी भी तरह की चर्चा करते हुए कर रहे हैं नहीं बदल रहे हैं, तो आप ऐसा बस उपयोग कर सकते हैं:

foreach (StudentDTO student in studentDTOList) 
{ 
    student.name = SomeName; 
} 

या अभी भी एक विधि कॉल:

foreach (StudentDTO student in studentDTOList) 
{ 
    ChangeStudent(student); 
} 

दोनों मामलों में, कोड यात्रा चर (student) का मान नहीं बदलता है तो यह ठीक है।

लेकिन आपका मूल उदाहरण किसी भी तरह संकलित नहीं होता है - foreach लूप द्वारा प्रस्तुत एक पुनरावृत्ति चर केवल पढ़ने के लिए है।

+0

नाम के बराबर होगा वर्तमान में लेकिन +1 या तो – Sayse

+0

वास्तव में मैं कोड के लिए एक उदाहरण दे रहा हूं, मेरा मूल कोड उस चर से बहुत सारे मूल्यों को बदल रहा है लेकिन विमान foreach() के साथ यह काम नहीं कर रहा है यह त्रुटि दिखाता है। –

+1

@ user2553512: "यह त्रुटि दिखाता है" * कभी * पर्याप्त जानकारी नहीं है ... और ऑब्जेक्ट के भीतर बहुत सारे डेटा को बदलना ठीक है, आप केवल पुनरावृत्ति चर के लिए एक नया मान असाइन नहीं कर सकते हैं। तो आप 'चेंजस्ट्यूडेंट (छात्र)' को कॉल कर सकते हैं जो डेटा बदल देगा - आप सिर्फ 'छात्र = चेंजस्ट्यूडेंट (छात्र) 'नहीं कर सकते हैं। –

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