繁体   English   中英

修改foreach循环内对象的属性不起作用?

[英]Modifying a property of an object inside of a foreach loop doesn't work?

这令我感到困惑。 我正在使用PetaPoco从数据库中检索某些值,然后循环它们并检索一个值以分配给每个对象的一个​​属性。

    public IEnumerable<RetreaveIndex> FillResults(IEnumerable<RetreaveIndex> results)
    {
        //add the associated users
        foreach (RetreaveIndex index in results)
        {
            index.AssociatedUsers = _registeredUserDao.GetUsersByIndex(index).ToList();
        }
        return results;
    }

当我在foreach循环期间设置断点时,正确设置了AssociatedUsers属性。 在foreach循环期间

但是在循环结束的断点处,它没有保存它? 在此输入图像描述

我很困惑,不应该将Index作为对正在被修改的内存中的位置的引用吗? 毕竟这是一个对象。 我在这里错过了什么?

  1. 什么是IEnumerable实现? 它可以返回对象的副本吗?

  2. RetreaveIndex是一个结构,因此是一个值类型? 如果是这样,那么变量index将是一个副本。

根据传入的IEnumerable的实现方式,它不要求下次枚举数据时它返回与之前相同的对象。 尝试在foreach循环之前将IEnumerable转换为List并返回该insead。

项目网站

查询与提取

Database类有两种方法用于检索记录Query和Fetch。 除了Fetch返回POCO的List <>之外,它们几乎完全相同,而Query使用yield return来迭代结果而不将整个集合加载到内存中。

换句话说, Query每次都会从后备存储重新加载值,并且在枚举后不会保留项目。 当您在循环结束后再次查看项目时,将从后备存储重新加载该项目。

实际上,正在发生的是你错误解释了yield return语法的输出。

发生的事情是,当您迭代从yield returnIEnumerable ,正在执行该yield return之后的代码。 在技​​术方面, yield return正在进行懒惰评估。 因此,在你的foreach循环的净效果是它调用代码来使IEnumerable中的项目成为可能,因为很多项目都在IEnumerable

CodeProject的以下帖子非常出色地解释了这种行为: http//www.codeproject.com/Articles/38097/The-Mystery-Behind-Yield-Return.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM