2010-06-03 3 views
2

은 당신이 새로운 인스턴스 당신이 GetFoos 이상 열거 할 때마다 만들 수 있기 때문이다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}; 
       } 
+0

IsEqualTo()? 대신 Equals()를 사용해보십시오. – tgiphil

+0

@tgiphil 죄송합니다. 내 연장 부분은 Assert.AreEqual이 – Omu

답변

7

var source = GetFoos();var source = GetFoos().ToList();으로 변경하면 목록이 즉시 (그리고 전체적으로) 읽혀집니다. 그런 다음 값을 변경할 수 있어야합니다.

변경된 값을 저장하는 것을 잊지 마십시오. 그렇지 않으면 다음에 읽을 때 되돌립니다.

10

을 변경하지 않습니다이 같은 및 컬렉션의 값을한다.

+0

안에 있으며 어떻게 수정하겠습니까? – Omu

+0

함수의 범위 밖으로 그들을 저장? – RvdK

+0

@omu 나는 fearofawhackplanet의 해결책이나 받아 들여지는 대답으로 갈 것입니다. – SteinNorheim

1

yield return의 사용 때문입니다.

대신 쓸 수있다 : 당신이 First()를 호출 할 때 새로운 열거가

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 }, 
    }; 
} 
1

을 만들어집니다. 그래서 GetFoos()이 다시 호출되어 새 개체를 반환합니다.

관련 문제