我做这样的事情,集合中的值不会改变
[Test]
public void EnumerableTest()
{
var source = GetFoos();
source.First().One = "hello";
Assert.AreEqual(source.First().One, "hello");
//it fails
}
//I actually return this from a repository
public IEnumerable<Foo> GetFoos()
{
yield return new Foo() {One = "1", Two = "2", Three = true};
yield return new Foo() {One = "1", Two = "2", Three = true};
yield return new Foo() {One = "1", Two = "2", Three = true};
}
答案 0 :(得分:10)
这是因为每次枚举GetFoos时都会创建新实例。
答案 1 :(得分:7)
如果您将var source = GetFoos();
更改为var source = GetFoos().ToList();
,则会立即(并完整)读取该列表。然后你应该能够改变这些值。
不要忘记存储更改的值,否则在下次阅读时它们会恢复。
答案 2 :(得分:1)
这是因为您使用了yield return
。
你可以写一下:
public IEnumerable<Foo> GetFoos()
{
return new List<Foo>
{
new Foo { One = "1", Two = "2", Three = true },
new Foo { One = "1", Two = "2", Three = true },
new Foo { One = "1", Two = "2", Three = true },
};
}
答案 3 :(得分:1)
当您致电First()
时,会创建一个新的枚举器。
因此再次调用GetFoos()
并返回一个新对象。