2010-06-03 40 views
2

我做這樣的事情,並集合中的值不會更改爲什麼我不能編輯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 2010-06-03 09:00:21

+0

@tgiphil對不起,這是我自己的擴展,它有 – Omu 2010-06-03 09:02:13

回答

7

如果將var source = GetFoos();更改爲var source = GetFoos().ToList();,則會立即(並全部)讀取列表。那麼你應該能夠改變這些值。

不要忘記存儲更改的值,否則它們會在下次讀取時恢復。

10

那是因爲你創建新實例每次枚舉GetFoos時間。

+0

內的Assert.AreEqual,你會如何解決這個問題? – Omu 2010-06-03 08:58:32

+0

將它們存儲在函數的範圍之外? – RvdK 2010-06-03 09:01:41

+0

@omu我要麼去恐懼黑社會的解決方案,要麼你接受的答案。 – SteinNorheim 2010-06-03 09:24:22

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

當你調用First()創建一個新的枚舉。 因此GetFoos()被再次調用並返回一個新的對象。

相關問題