改变IEnumerator的属性<T>.当前

Jen*_*ens 10 c# ienumerable

我惊讶地看到了今天的下列行为:给出一堂课

class Foo
{
    prop int FooNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和这段代码

IEnumerable<Foo> foos = Enumerable.Range(0,3).Select(new Foo());

foreach (var foo in foos)
    foo.Bar = 5;

foreach (var foo in foos)
   Console.Write(foo.Bar);  // Writes 000
Run Code Online (Sandbox Code Playgroud)

初始化foosnew List<Foo>{ new Foo(), new Foo(), new Foo() }使循环写入"555".

我的问题:为什么会发生这种情况,有没有办法绕过这个无需使用.ToList()(需要评论,因为这里似乎不需要).

Jon*_*Jon 20

它发生的原因foos是每次枚举它时都会动态生成.因此,在第一次迭代期间,您将在迭代结束后不再被任何引用的对象上设置属性值.第二次迭代适用于具有默认属性值的新构造对象.

初始化foos为"持久"对象列表会改变事物,因为使用.ToList()原因相同(构造"固定"列表并迭代两次;动态生成的原始列表IEnumerable仅迭代一次).

在确定了应该使用.ToList()在这里:总的来说,我不认为它需要一个评论,因为它不是习惯迭代不止一次动态生成的序列(相信很多代码分析工具警惕这一点),但通过各种手段做写一个.