2013-02-16 15 views
5

की संपत्ति को नहीं बदल रहा है मैंने इसके बारे में कुछ प्रश्न देखे हैं, और कुछ शोध किए हैं।फॉरएच लूप कक्षा

मेरी समझ यह है कि जब आप IENumerable पर एक foreach चलाते हैं: यदि टी एक संदर्भ प्रकार (उदा। कक्षा) है तो आप लूप के भीतर से वस्तु के गुणों को संशोधित करने में सक्षम होना चाहिए। यदि टी एक मान प्रकार है (उदा। संरचना) यह काम नहीं करेगा क्योंकि पुनरावृत्ति परिवर्तक स्थानीय प्रतिलिपि होगी।

मैं निम्नलिखित कोड के साथ एक विंडोज स्टोर ऐप्स पर काम कर रहा हूँ:

मेरे कक्षा:

public class WebResult 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string DisplayUrl { get; set; } 
    public string Url { get; set; } 
    public string TileColor 
    { 
     get 
     { 
      string[] colorArray = { "FFA200FF", "FFFF0097", "FF00ABA9", "FF8CBF26", 
      "FFA05000", "FFE671B8", "FFF09609", "FF1BA1E2", "FFE51400", "FF339933" }; 
      Random random = new Random(); 
      int num = random.Next(0, (colorArray.Length - 1)); 
      return "#" + colorArray[num]; 
     } 
    } 
    public string Keywords { get; set; } 
} 

कोड:

IEnumerable<WebResult> results = from r in doc.Descendants(xmlnsm + "properties") 
           select new WebResult 
           { 
            Id = r.Element(xmlns + "ID").Value, 
            Title = r.Element(xmlns + "Title").Value, 
            Description = r.Element(xmlns + 
                 "Description").Value, 
            DisplayUrl = r.Element(xmlns + 
                 "DisplayUrl").Value, 
            Url = r.Element(xmlns + "Url").Value, 
            Keywords = "Setting the keywords here" 
           }; 

foreach (WebResult result in results) 
{ 
    result.Keywords = "These, are, my, keywords"; 
} 

if (control is GridView) 
{ 
    (control as GridView).ItemsSource = results; 
} 

एक बार परिणाम प्रदर्शित हो "कीवर्ड" संपत्ति "यहां कीवर्ड सेट करना" है। अगर मैं फ़ोरैच लूप में ब्रेक पॉइंट डालता हूं तो मैं देख सकता हूं कि परिणाम ऑब्जेक्ट संशोधित नहीं हो रहा है ...

क्या कोई विचार चल रहा है? क्या मैं बस कुछ स्पष्ट याद कर रहा हूँ? क्या Windows स्टोर ऐप्स के लिए .NET में IENumerable अलग-अलग व्यवहार करता है?

+1

यदि आपके पास रिशेर्पर हाथ में था, चेतावनी "आईन्यूमेरेबल की संभावित एकाधिक गणना" संकेत हो सकता है। आप प्रत्येक गणना के लिए एक नया संग्रह उत्पन्न कर रहे हैं। –

+0

संभावित डुप्लिकेट [एक आईनेमरेबल में परिवर्तन क्वेरी के बीच नहीं रखा जा रहा है] (http://stackoverflow.com/questions/4083771/changes-to-an-ienumerable-are-not-being-kept-between-queries) – R0MANARMY

उत्तर

6

इसे deferred execution के रूप में जाना जाता है; results एक प्रश्न है जो हर बार जब आप इसे पुन: सक्रिय करते हैं तो निष्पादित किया जाता है। आपके मामले में यह दो बार मूल्यांकन किया जाता है, एक बार लूप में, और दूसरी बार जब यह डाटाबेस होता है।

आप इस

var results2 = results.ToList(); 

foreach (WebResult result in results2) 
{ 
    result.Keywords = "These, are, my, keywords"; 
} 

if (control is GridView) 
{ 
    (control as GridView).ItemsSource = results2; 
} 

की तरह कुछ कर रही आप देखना चाहिए कि आपके परिवर्तन कायम कर इसकी पुष्टि कर सकते हैं।

+0

क्या एकाधिक पुनरावृत्तियों के परिणाम संशोधित नहीं होने के कारण हैं या प्रकार IENumerable – Sunny

+0

धन्यवाद, मुझे इसे संभावित डुप्लिकेट लिंक से मिला है। इसके कई पुनरावृत्तियों के कारण। – Sunny

+0

@ सुंदिप यह इतनी अधिक पुनरावृत्ति नहीं है क्योंकि आप शायद आईनेमेरेबल के अर्थशास्त्र को गलत समझाते हैं। बहुत से लोग पहली बार यह गलती करते हैं। – R0MANARMY

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