gpt4 book ai didi

c# - 名为 toList() 的 Linq 查询是否生成所包含元素的副本?

转载 作者:行者123 更新时间:2023-11-30 14:25:32 25 4
gpt4 key购买 nike

我遇到了(对我来说)奇怪的行为。这是代码:

var objects = from i in items
//some calculations
select something;

// other calculations

objects.ToList().ForEach(x => {
//some calculations
x.Property = "some text"
});

return objects;

首先我生成一个IEnumerable,它是对数据库的查询,我跳过了细节。然后我必须进行其他计算,最后我遍历我的对象以设置进一步的参数。运行此代码,一旦返回 IEnumerable 对象,就不会设置它们的 Property

否则,如果我如下移动 Linq 表达式中的 ToList(),则会设置 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;

据我所知,对象没有被复制,而是被引用……对吧?明显的代码背后发生了什么?有什么区别?

最佳答案

请记住,Linq 查询只是一个查询 - 它表示“如果我请求此数据,这就是我想要的_。它不保存任何数据,而是等到您请求_结果(通过 foreachToListToArray 等)

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

所以在这方面 - 是的 ToList() 创建了一个新列表。它不会修改调用它以将其变成列表的对象。

在您的第二个示例中,objects 变量包含对通过 ToList() 查询生成的 list 的引用,因此当您修改他们并返回 objects 你正在返回相同的列表。

关于c# - 名为 toList() 的 Linq 查询是否生成所包含元素的副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37992113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com