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?
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. –
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