2013-11-21 5 views
10

के साथ समस्याएं मेरे सी # ऐप में सूची के साथ मेरे कुछ अजीब मुद्दे हैं। यह आवंटन गलती होनी चाहिए या मैं कुछ गलत कर रहा हूं (मैं औसत सी # डेवलपर हूं)। मैं "onehalf" और "एक" MySecondaryList में होने की MyPrimaryList में पहली सरणी में पहला मान उम्मीद करेंगेसी # "मजाकिया" सूची <String[]>

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 
String[] array; 

String arrayList = "one,two,three,four,five"; 
array = arrayList.Split(','); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(array); 

MyPrimaryList[0][0] += "half"; 

तो अब: मुझे मेरे लाइनों के पास एक उदाहरण देता हूँ। लेकिन मेरी समस्या/समस्या यह है कि दोनों सूचियों को दोनों सूचीओं में पहली सरणी में "आधा" के साथ अद्यतन किया जाता है।

क्या आपके पास अच्छी व्याख्या है? :)

धन्यवाद !!

+1

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

+0

आप दोनों ऑब्जेक्ट में एक ही ऑब्जेक्ट जोड़ रहे हैं - दूसरे शब्दों में केवल एक 'सरणी' है जिसे आप कहीं भी प्रतिलिपि नहीं बनाते हैं ... – tpeczek

उत्तर

18

String[] array; साथ ऐसा कर सकते एक संदर्भ प्रकार है। आपने इस ऑब्जेक्ट की स्मृति में दोनों सूचियों में स्थान का संदर्भ जोड़ा है, इसलिए वे दोनों एक ही डेटा रखते हैं।

आप array की एक प्रति है करने के लिए दूसरी सूची की जरूरत है तो आप Array.Copy उपयोग कर सकते हैं:

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 

String arrayList = "one,two,three,four,five"; 
String[] array = arrayList.Split(','); 
String[] array2 = new string[5]; 

Array.Copy(array, array2, 5); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(array2); 

MyPrimaryList[0][0] += "half"; 

Console.WriteLine(MyPrimaryList[0][0]); 
Console.WriteLine(MySecondaryList[0][0]); 

इस स्रोत सरणी, एक गंतव्य सरणी और लंबाई लेता है - सरणी सीमा जाँच करने के लिए सावधान रहना होगा।

यह आउटपुट:

onehalf 
one 

चूंकि प्रत्येक सूची में अब एक अलग सरणी के लिए एक संदर्भ रखती है, आप सरणी आइटम स्वतंत्र रूप से हेरफेर कर सकते हैं।

9

आप दोनों सूचियों में सरणी का एक ही उदाहरण जोड़ रहे हैं, इसलिए वे एक ही स्मृति संरचना को इंगित करते हैं।

यदि आप उन्हें स्वतंत्र होना चाहते हैं तो आपको उन्हें क्लोन करना होगा; मेरे सिर के शीर्ष से एक त्वरित तरीका

+1

'चयन करें (x => x)' स्ट्रिंग [] के बाद से आवश्यक नहीं है 'पहले से ही लागू होता है 'IENumerable '। –

+0

@Eren, आप सही हैं, मैंने ऐसा इसलिए किया क्योंकि 100% सुनिश्चित नहीं था कि सरणी पर कॉल करने के लिए ToArray एक नई प्रतिलिपि वापस कर देगा। लेकिन मैंने जांच की और यह वही तरीका है जो यह काम करता है –

7

Arrays संदर्भ ऑब्जेक्ट्स हैं, इसलिए आप स्मृति में समान संग्रह को संशोधित कर रहे हैं। तुम सब क्या कर रहे हैं अनिवार्य रूप से इस दस्तावेज़

Passing Arrays as Arguments (C# Programming Guide)

आप स्वायत्तता आप चाहते हैं पाने के लिए सरणी की एक गहरी प्रतिलिपि करने की आवश्यकता होगी में एक ही संरचना करने के लिए संकेत जोड़ रहा है,

एक नज़र डालें।

आप Array.Copy

0

आप प्रत्येक सूची आप क्योंकि अभी आप एक ही स्मृति संरचना पर ओर इशारा करते हैं के साथ काम कर रहे हैं के लिए एक सरणी

सही कोड होना चाहिए बनाना चाहिए:

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 
String[] array; 
String[] secondaryArray; 

String arrayList = "one,two,three,four,five"; 
array = arrayList.Split(','); 
secondaryArray = arrayList.Split(','); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(secondaryArray); 

MyPrimaryList[0][0] += "half"; 

अब अपनी दूसरी सूची होगा "एक" और पहला तत्व के रूप में "onehalf" नहीं

0

उल्लेख सरणी के रूप में एक संदर्भ प्रकार है और इसलिए दोनों सूची में एक ही सरणी

को इंगित करेंगे

हल करने के लिए आपकी समस्या का उपयोग Clone विधि ..

MyPrimaryList.Add((String[])array.Clone()); 
MySecondaryList.Add((String[])array.Clone()); 

हालांकि यह है कि सरणी के एक उथले नकल करना होगा, लेकिन यह अपने मामले

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