Почему я не могу редактировать элементы IEnumerable? - PullRequest
2 голосов
/ 03 июня 2010

Я делаю что-то подобное, и значение в коллекции не меняется

                [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 ]

10 голосов
/ 03 июня 2010

Это потому, что вы создаете новые экземпляры каждый раз при перечислении через GetFoos.

7 голосов
/ 03 июня 2010

Если вы измените var source = GetFoos(); на var source = GetFoos().ToList();, список будет прочитан немедленно (и полностью). Тогда вы сможете изменить значения.

Не забудьте сохранить измененные значения, иначе они будут возвращены при следующем чтении.

1 голос
/ 03 июня 2010

Когда вы звоните First(), создается новый перечислитель. Итак, GetFoos() вызывается снова и возвращает новый объект.

1 голос
/ 03 июня 2010

Это из-за вашего использования 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 },
    };
}
...