2016-11-19 10 views
5

मुझे थोड़ी सी समस्या है जब मैं सी # में कुछ संचालन करना चाहता हूं। मैं आपको थोड़ा सा उदाहरण दूंगा।जेनेरिक सूची का ढेर साफ़ हो जाता है जब धक्का सूची साफ़ हो जाती है

Stack<List<HufmannLetter>> steps = new Stack<List<HufmannLetter>>(); 
List<HufmannLetter> letterList = new List<HufmannLetter>();  

while(true){ 

    letterList.Add("asd"); 
    letterList.Add("sad"); 

    steps.Push(letterList); 
    letterlist.Clear();  
} 

इस कोड में, मैं सूची में सभी आइटमों को हटाने की तुलना में अपनी लिंक्डलिस्ट को ढेर में धक्का देना चाहता हूं। जब मैं सूची साफ़ करता हूं, तो मेरी स्टैक की पहली अनुक्रमणिका गायब हो जाती है क्योंकि यह संदर्भ द्वारा पारित होती है। क्या मै गलत हु? क्योंकि मुझे नहीं पता कि ऐसा क्यों होता है।

तो मैं मूल्य विधि द्वारा पास का उपयोग करता हूं।

Stack<List<HufmannLetter>> steps = new Stack<List<HufmannLetter>>(); 
List<HufmannLetter> letterList = new List<HufmannLetter>(); 

while(true) { 

    letterList.Add("asd"); 
    letterList.Add("sad"); 

    List<HufmannLetter> tempLetterList = new List<HufmannLetter>(letterList); 
    steps.Push(tempLetterList); 
    letterlist.Clear();  
} 

क्या यह समस्या हल करने का एक अच्छा तरीका है? इस तरह यह काम कर रहा है, लेकिन पठनीयता कम हो जाती है। तुम मुझे क्या सलाह देते हो?

धन्यवाद ...

+2

"क्या मैं गलत हूं?" हां, आपके द्वारा दिखाए गए कोड में कोई पास-बाय-रेफरेंस नहीं है। आप 'रेफरी' और 'आउट' की कमी से बता सकते हैं। मेरा सुझाव है कि आप http://jonskeet.uk/csharp/parameters.html और http://jonskeet.uk/csharp/references.html पढ़ते हैं नोट करें कि मान द्वारा संदर्भ पारित करना पास-बाय-रेफरेंस जैसा नहीं है। –

उत्तर

3

बस पाश के भीतर एक नया List<HufmannLetter> वस्तु बना सकते हैं और ढेर करने के लिए कि जोड़ें। उसी सूची ऑब्जेक्ट का पुन: उपयोग करने से कोई प्रदर्शन लाभ नहीं होगा।

Stack<List<HufmannLetter>> steps = new Stack<List<HufmannLetter>>(); 

while(true) 
{ 
    List<HufmannLetter> letterList = new List<HufmannLetter>(); 

    letterList.Add("asd"); 
    letterList.Add("sad"); 

    steps.push(letterList); 
} 
+0

हाँ मुझे पता है, यह मेरे प्रदर्शन को प्रभावित नहीं करता है लेकिन मैं अपने कोड की समझदारी के बारे में सोच रहा हूं। लेकिन अगर कोई रास्ता नहीं है, तो मैं अपना कोड नहीं बदलूंगा। बहुत बहुत धन्यवाद :) – Berkin

+1

उत्तर में से कोई भी उत्तर ओपी की व्याख्या नहीं करता है 'जब मैं सूची साफ़ करता हूं, तो मेरा स्टैक का पहला सूचकांक गायब हो जाता है क्योंकि यह संदर्भ द्वारा पारित होता है। क्या मै गलत हु? क्योंकि मुझे नहीं पता कि ऐसा क्यों होता है। ' –

+0

@ बर्किन, आप का मतलब क्या है "कोई रास्ता नहीं है" _? मेरा उदाहरण आपके जैसा नहीं है। –

1

आप new List<HufmannLetter>() बना सकते हैं और निर्माता में पिछली सूची दे सकते हैं, यह नई वस्तु जो साफ़ नहीं किया जाएगा पैदा करेगा।

while(condition) 
{ 
    letterList.Add("asd"); 
    letterList.Add("sad"); 

    steps.push(new List<HufmannLetter>(letterList)); 
    letterlist.Clear(); 
} 

संपादित

तो List<T> संदर्भ प्रकार, आप ढेर में letterList लगा रहे है। इस तरह आप स्टैक आइटम में संदर्भ List<T> के मान को स्थानांतरित कर रहे हैं। तो आपका लेटरलिस्ट वैरिएबल उसी ऑब्जेक्ट को आपके स्टैक में आइटम के रूप में संदर्भित करता है। जब आप अक्षरसूची से आइटम साफ़ करते हैं, तो उन्हें स्टैक के आइटम में भी साफ़ कर दिया जाता है।

चेक Reference Types

+1

उत्तर में से कोई भी उत्तर ओपी की व्याख्या नहीं करता है 'जब मैं सूची साफ़ करता हूं, तो मेरा स्टैक का पहला सूचकांक गायब हो जाता है क्योंकि यह संदर्भ द्वारा पारित होता है। क्या मै गलत हु? क्योंकि मुझे नहीं पता कि ऐसा क्यों होता है। ' –

+0

@Am_I_Helpful मुझे लगता है कि सेशन समझता है कि स्टैक में उनकी सूचियों से मूल्यों को क्यों मंजूरी दी जाती है। अगर वह इसे समझ में नहीं आता है तो मैं थोड़ा सा स्पष्टीकरण लिखूंगा। – mybirthname

-1

है क्या आप भी करते

रूप
Stack<List<HufmannLetter>> steps = new Stack<List<HufmannLetter>>(); 

while(true) 
{ 
var tempList = new List<HufmannLetter>; 
tempList.add("asd"); 
steps.push(tempList); 
} 

या आप कोशिश कर सकते हैं कि कर सकते हैं इस

steps.push(tempList.ToList()); 
    tempList.Clear(); 
+0

यह वही उत्तर है जो botond.botos है जो 6 मिनट से पहले दिया गया था। – mybirthname

+0

हां यह है लेकिन कृपया दूसरे भाग की जांच करें –

1

List<> एक परिवर्तनशील संदर्भ प्रकार है।

जब आप किसी विधि पर List<> पास करते हैं, तो आप संदर्भ की एक प्रति पास करते हैं। तो आप बस बताएं कि List<> यह है। वह List<> की संपूर्ण सामग्री की प्रतिलिपि (क्लोन) नहीं करेगा।

जब आप Stack<> पर (Push) एक List<> शब्दों में कहें, क्या Stack<> वास्तव में रहता है List<> के इस उदाहरण के लिए एक संदर्भ की एक प्रति है। यदि उस उदाहरण को बाद में संशोधित किया गया है, उदाहरण के लिए .Add("asd") या .Clear() के साथ, यह "उत्परिवर्तन" देखा जाएगा कि क्या आप स्थानीय चर से Stack<> या आपके अन्य संदर्भ द्वारा रखे गए संदर्भ का पालन करते हैं या नहीं। List<> के समान उदाहरण के लिए दोनों संदर्भ "बिंदु"।

करते हैं, अपने कोड में, आप कहते हैं:

letterList.Clear(); // do not change reference, follow reference and mutate the instance it refers to 

कि संशोधित करेगा (उत्परिवर्तित) List<> की मौजूदा उदाहरण तो यह खाली हो जाता है। यह परिवर्तन किसी भी व्यक्ति द्वारा List<> के इस विशेष उदाहरण के संदर्भ में देखा जाएगा।

इसके बजाय यदि आपने किया था:

letterList = new List<string>(); // create new instance, change reference to point there (reference assignment), old instance is unchanged 

होता है कि "चले गए" letterList के संदर्भ List<> के नई उदाहरण के लिए बात करने के लिए। यह "पुराने" उदाहरण के अन्य संदर्भों वाले लोगों को प्रभावित नहीं करेगा।


शीर्षक दर्रा संदर्भ प्रयोग तक भ्रामक है। यह संदर्भ प्रकार और पासिंग संदर्भ या ऐसा कुछ होना चाहिए था।

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