ForEach循环不改变类的属性

Ted*_* A. 5 c# ienumerator foreach windows-store-apps

我已经看到了几个关于这个的问题,并做了一些研究.

我的理解是当你在IEnumerable上运行foreach时:如果T是一个引用类型(例如Class),你应该能够在循环中修改对象的属性.如果T是值类型(例如Struct),则这将不起作用,因为迭代变量将是本地副本.

我正在使用以下代码在Windows应用商店应用上工作:

我的课:

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; }
}
Run Code Online (Sandbox Code Playgroud)

代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

结果显示后,"关键字"属性为"在此处设置关键字".如果我在foreach循环中设置了一个断点,我可以看到结果对象没有得到修改......

关于发生了什么的任何想法?我只是缺少一些明显的东西吗?IEnumerable在.NET中对Windows Store应用程序的行为有何不同?

R0M*_*RMY 6

这被称为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;
}
Run Code Online (Sandbox Code Playgroud)

您应该看到您的更改仍然存在.