2013-02-16 9 views
5

Ho visto un paio di domande su questo e ho fatto qualche ricerca.ForEach loop che non modifica la proprietà della classe

La mia comprensione è che quando si esegue un foreach su IEnumerable: se T è un tipo di riferimento (ad esempio Classe) si dovrebbe essere in grado di modificare le proprietà dell'oggetto dall'interno del ciclo. Se T è un tipo di valore (ad esempio Struct), ciò non funzionerebbe poiché la variabile di iterazione sarebbe una copia locale.

Sto lavorando su un'applicazione Windows Store con il seguente codice:

mio Classe:

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

Il Codice:

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

Una volta che i risultati vengono visualizzati i "Parole chiave" proprietà è "Impostazione delle parole chiave qui". Se metto un punto di interruzione nel ciclo foreach posso vedere che l'oggetto dei risultati non viene modificato ...

Qualche idea su cosa sta succedendo? Mi manca qualcosa di ovvio? IEnumerable si comporta in modo diverso in .NET Per le app di Windows Store?

+1

Se si dispone di Resharper a portata di mano, l'avviso "Possibile enumerazione multipla di IEnumerable" potrebbe essere un suggerimento. Stai generando una nuova raccolta per ogni enumerazione. –

+0

possibile duplicato di [Le modifiche a un oggetto IEnumerable non vengono mantenute tra le query] (http://stackoverflow.com/questions/4083771/changes-to-an-ienumerable-are-not-being-kept-trapt-treries) – R0MANARMY

risposta

6

Questo è noto come deferred execution; results è una query che viene eseguita ogni volta che si itera su di essa. Nel tuo caso viene valutato due volte, una volta nel ciclo for, e una seconda volta quando è nel database.

È possibile verificare questo facendo qualcosa di simile

var results2 = results.ToList(); 

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

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

Dovreste vedere che le modifiche persistevano.

+0

Le iterazioni multiple sono un motivo per cui i risultati non vengono modificati o il tipo IEnumerable – Sunny

+0

Grazie, l'ho ottenuto dal possibile collegamento duplicato. È dovuto a più iterazioni. – Sunny

+0

@Sundeep Non si tratta tanto di iterazioni multiple quanto probabilmente hai frainteso la semantica di IEnumerable. Molte persone commettono questo errore la prima volta. – R0MANARMY

Problemi correlati