Linq-Query是否被称为toList()生成包含元素的副本?

Ema*_*rsa 3 c# linq tolist

我遇到了一个(对我而言)奇怪的行为.这是代码:

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)

据我所知,对象没有复制,但被引用......对吗?显然代码背后会发生什么?有什么不同?

D S*_*ley 6

请记住,LINQ查询只是一个查询-这是说:"如果我问这个数据,这是我want_它不包含任何数据,而是等待你ask_的结果(通过foreach,ToList,ToArray,等)

不同之处在于您没有捕获ToList第一个示例中返回的列表.它由ForEach调用使用,但objects变量仍保留对原始查询的引用.当你再次要求它时 - 它会再次获取数据.当它再次获取数据时,会创建新对象.

所以在这方面 - 是的,ToList()创造了一个新的清单.它不会修改它被调用的对象将其转换为列表.

在第二个示例中,objects变量保存对从查询生成的列表的引用ToList(),因此当您修改它们并返回时,objects您将返回相同的列表.

  • @Taemyr我认为你是不理解的人.DStanley和我在答案中所写的内容正是正在发生的事情. (2认同)