我遇到了一个(对我而言)奇怪的行为.这是代码:
var objects = from i in items
//some calculations
select something;
// other calculations
objects.ToList().ForEach(x => {
//some calculations
x.Property = "some text"
});
return objects;
Run Code Online (Sandbox Code Playgroud)
首先我生成一个IEnumerable,它是对db的查询,我跳过了细节.然后我必须做其他计算,最后我迭代我的对象来设置另一个参数.运行此代码,一旦IEnumerable返回对象,Property就不会设置它们.
否则,如果我ToList()按照后面的Linq表达式移动,Property则设置为:
var objects = (from i in items
//some calculations
select something).ToList();
// other calculations
objects.ForEach(x => {
//some calculations
x.Property = "some text"
});
return objects;
Run Code Online (Sandbox Code Playgroud)
据我所知,对象没有复制,但被引用......对吗?显然代码背后会发生什么?有什么不同?
请记住,LINQ查询只是一个查询-这是说:"如果我问这个数据,这是我want_它不包含任何数据,而是等待你ask_的结果(通过foreach,ToList,ToArray,等)
不同之处在于您没有捕获ToList第一个示例中返回的列表.它由ForEach调用使用,但objects变量仍保留对原始查询的引用.当你再次要求它时 - 它会再次获取数据.当它再次获取数据时,会创建新对象.
所以在这方面 - 是的,ToList()创造了一个新的清单.它不会修改它被调用的对象将其转换为列表.
在第二个示例中,objects变量保存对从查询生成的列表的引用ToList(),因此当您修改它们并返回时,objects您将返回相同的列表.