[英]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属性。
但是在循环结束的断点处,它没有保存它?
我很困惑,不应该将Index作为对正在被修改的内存中的位置的引用吗? 毕竟这是一个对象。 我在这里错过了什么?
什么是IEnumerable实现? 它可以返回对象的副本吗?
RetreaveIndex是一个结构,因此是一个值类型? 如果是这样,那么变量index
将是一个副本。
根据传入的IEnumerable的实现方式,它不要求下次枚举数据时它返回与之前相同的对象。 尝试在foreach循环之前将IEnumerable转换为List并返回该insead。
从项目网站 :
查询与提取
Database类有两种方法用于检索记录Query和Fetch。 除了Fetch返回POCO的List <>之外,它们几乎完全相同,而Query使用yield return来迭代结果而不将整个集合加载到内存中。
换句话说, Query
每次都会从后备存储重新加载值,并且在枚举后不会保留项目。 当您在循环结束后再次查看项目时,将从后备存储重新加载该项目。
实际上,正在发生的是你错误解释了yield return
语法的输出。
发生的事情是,当您迭代从yield return
的IEnumerable
,正在执行该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.