为什么我不能编辑IEnumerable的元素?

时间:2010-06-03 08:54:13

标签: c# ienumerable

我做这样的事情,集合中的值不会改变

                [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};
                }

4 个答案:

答案 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()并返回一个新对象。