选择后进行foreach迭代

时间:2018-12-12 09:53:01

标签: c# linq

任何人都可以解释这种行为吗?

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

1 个答案:

答案 0 :(得分:6)

models是一个序列,每次您对其进行迭代时,都会填充新的Model实例。即每当您进行遍历时,都会得到一组新的实例。

调用ToList()时,将捕获其中一个迭代的副本以及所有随后可以修改的实例。