2013-02-16 14 views
5

Ich habe ein paar Fragen dazu gesehen, und recherchiert.ForEach Schleife nicht ändern Eigenschaft der Klasse

Mein Verständnis ist, dass wenn Sie eine foreach auf IEnumerable ausführen: wenn T ein Referenztyp (z. B. Klasse) ist, sollten Sie in der Lage sein, Eigenschaften des Objekts innerhalb der Schleife zu ändern. Wenn T ein Werttyp ist (z. B. Struct), würde dies nicht funktionieren, da die Iterationsvariable eine lokale Kopie wäre.

ich auf einem Windows Store App mit dem folgenden Code arbeite:

Meine Klasse:

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; } 
} 

Der Code:

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; 
} 

Sobald die Ergebnisse der "Keywords" erhalten angezeigt Eigenschaft ist "Hier die Schlüsselwörter setzen". Wenn ich einen Unterbrechungspunkt in der foreach-Schleife setze, kann ich sehen, dass das Ergebnisobjekt nicht geändert wird ...

Irgendwelche Ideen, was vor sich geht? Fehle ich gerade etwas Offensichtliches? Verändert sich IEnumerable in .NET für Windows Store Apps anders?

+1

Wenn Sie Resharper zur Hand hatten, könnte die Warnung "Mögliche mehrfache Aufzählung von IEnumerable" ein Hinweis sein. Sie generieren für jede Aufzählung eine neue Sammlung. –

+0

mögliches Duplikat von [Änderungen an einem IEnumerable werden nicht zwischen Abfragen beibehalten] (http://stackoverflow.com/questions/4083771/changes-to-an-ienumerable-are-not-being-kept-between-queries) – R0MANARMY

Antwort

6

Dies ist bekannt als deferred execution; results ist eine Abfrage, die jedes Mal ausgeführt wird, wenn Sie darüber iterieren. In Ihrem Fall wird es zweimal ausgewertet, einmal in der for-Schleife und ein zweites Mal, wenn es datengebunden ist.

Sie können dies überprüfen, indem Sie so etwas wie dieses

var results2 = results.ToList(); 

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

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

Sie sehen sollten tun, dass Ihre Änderungen beibehalten.

+0

Sind mehrere Iterationen ein Grund dafür, dass Ergebnisse nicht geändert werden, oder den Typ IEnumerable – Sunny

+0

Danke, ich habe es von möglichen doppelten Link. Es ist aufgrund mehrerer Iterationen. – Sunny

+0

@Sundeep Es sind nicht so viele Mehrfachiterationen, wie Sie wahrscheinlich die Semantik von IEnumerable falsch verstanden haben. Viele Leute machen diesen Fehler zum ersten Mal. – R0MANARMY

Verwandte Themen