任何人都可以解释这种行为吗?
class Program
{
static void Main(string[] args)
{
var models = Enumerable.Range(0, 10).Select(x => new Model { Id = x.ToString() });
foreach (var model in models)
{
model.Data = $"{model.Id} Data bla";
}
foreach (var model in models)
{
Console.WriteLine($"{model.Id} | {model.Data}");
}
Console.ReadLine();
}
}
public class Model
{
public string Id { get; set; }
public string Data { get; set; }
}
输出:
0 |
1 |
2 |
但是,如果我在Select之后调用ToList(),我的输出将更改为:
0 | 0数据bla
1 | 1个数据bla
2 | 2数据bla
我尝试在每个foreach块中放置一个断点并调用
models.Any(x=>x.Equals(model))
但总是在不调用ToList()的情况下返回false
答案 0 :(得分:6)
models
是一个序列,每次您对其进行迭代时,都会填充新的Model
实例。即每当您进行遍历时,都会得到一组新的实例。
调用ToList()
时,将捕获其中一个迭代的副本以及所有随后可以修改的实例。