ForEach loop does not change class property

I saw a couple of questions about this and did some research.

I understand that when starting foreach in IEnumerable: if T is a reference type (e.g. Class), you should be able to change the properties of the object from the loop. If T is a value type (e.g. Struct), this will not work, since the iteration variable will be a local copy.

I am working on a Windows Store application with the following code:

My class:

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

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

As soon as the results are displayed, the "Keywords" property is "Set keywords here." If I put a breakpoint in the foreach loop, I see that the result object is not changing ...

, ? - ? IEnumerable - .NET Windows Store?

+5
1

deferred execution; results - , , . , for , .

, -

var results2 = results.ToList();

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

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

, .

+6

All Articles