namespace ConsoleApplication4
{
class T1
{
public int MyProperty { get; set; }
}
class Program
{
static void Main(string[] args)
{
var tmp = (new[] { 1, 3, 4 }).Select(x =>new T1 { MyProperty=x});
foreach (var s in tmp)
{
s.MyProperty = 9;
}
foreach (var s in tmp)
{
Console.WriteLine(s.MyProperty);
}
Console.ReadLine();
}
}
}
我预计屏幕上有三个 9,但值仍然相同。
但是,如果我稍微修改一下代码,值就会成功更改,即:
var tmp = (new[] { 1, 3, 4 }).Select(x =>new T1 { MyProperty=x}).ToList();
我想知道为什么?
最佳答案
原因是延迟执行。
tmp
不是列表或数组。这只是一个定义如何创建枚举。或者换句话说:tmp
只是问题,而不是答案。
所以在第二个foreach
,由 Select
创建的枚举器再次执行,创建T1
的新实例.
当您使用 .ToList()
时相反,枚举被转换为 List
(所以 tmp
是一个 List<T1>
)。你可以迭代List
无需创建新实例即可随心所欲。
关于c# - 无法为 LINQ 选择的数据分配新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38049728/