2012-10-29 12 views
6

में प्रभावित कर रहा है, इसलिए, यह मुझे लगता है कि यह बहुत सीधे है।ऑब्जेक्ट ऑब्जेक्ट ऑब्जेक्ट के पिछले संस्करणों को फ़ोरैच लूप

Dictionary<int, IEnumerable<SelectListItem>> fileTypeListDict = new Dictionary<int, IEnumerable<SelectListItem>>(); 

foreach (PresentationFile pf in speakerAssignment.FKPresentation.PresentationFiles) 
{ 
    IEnumerable<SelectListItem> fileTypes = Enum.GetValues(typeof(PresentationFileType)) 
       .Cast<PresentationFileType>().Select(x => new SelectListItem 
     { 
      Text = x.ToString(), 
      Value = Convert.ToString((int)x), 
      Selected = pf.Type == (int)x 
     }); 

     fileTypeListDict.Add(pf.ID, fileTypes); 
} 

क्या हो रहा है कि अंत में शब्दकोश सब सही कुंजी होगा है, लेकिन सभी मान fileTypes सूची अंतिम यात्रा के दौरान बनाया पर निर्धारित किया जाएगा:

यहाँ मेरी कोड है लूप का। मुझे यकीन है कि इस संदर्भ के संदर्भ में वस्तु के साथ कुछ करने के लिए कुछ है, लेकिन सी # के साथ मेरे समय में इस मुद्दे को पहले नहीं देखा है। कोई भी यह बताने की परवाह करता है कि यह क्यों हो रहा है और मुझे इस मुद्दे को कैसे हल करना चाहिए?

धन्यवाद!

उत्तर

9

यह कुख्यात "foreach कैप्चर समस्या" है, और सी # 5 में "निश्चित" है ("निश्चित" एक मजबूत शब्द है, क्योंकि यह सुझाव देता है कि यह पहले "बग" था: हकीकत में - विनिर्देश अब बदल गया है भ्रम के एक आम कारण के रूप में इसे स्वीकार करने के लिए)। दोनों ही मामलों में लैम्ब्डा चरpf, नहीं "pf के इस यात्रा के दौरान मूल्य" कब्जा - लेकिन सी # में पहले-5 चर pfतकनीकी रूप से बाहर scoped पाश है (ताकि वहाँ केवल है उनमें से एक, अवधि), जहां सी # 5 और ऊपर के चर के ऊपर लूप के अंदर स्कॉप्ड किया गया है (इसलिए कैप्चर उद्देश्यों के लिए, प्रति पुनरावृत्ति के लिए एक अलग चर है)।

सी # 4 में, सिर्फ धोखा:

foreach (PresentationFile tmp in speakerAssignment.FKPresentation.PresentationFiles) 
{ 
    PresentationFile pf = tmp; 
    //... as before 

अब pfforeach अंदर scoped है, और यह ठीक काम करेंगे। इसके बिना, केवल एक pf है - और चूंकि आपने अंत तक निष्पादन स्थगित कर दिया है, इसलिए के मूल्य अंतिम पुनरावृत्ति होगा।

एक वैकल्पिक ठीक होगा: निष्पादन स्थगित नहीं है:

fileTypeListDict.Add(pf.ID, fileTypes.ToList()); // note the ToList 

अब यह मूल्यांकन किया जाता है, जबकि pf है "वर्तमान", तो आपके द्वारा अपेक्षित परिणाम होगा।

+0

मैं त्वरित और पूरी तरह से स्पष्टीकरण की सराहना करता हूं। आपका दिन अच्छा रहे! – PFranchise

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