我碰到一個有趣的問題今天在這裏我有兩個方法,快速瀏覽,都做同樣的事情來了。這是返回一個IEnumerable Foo對象。爲什麼LINQ會以不同的方式處理兩個「相同」事物的方法?
我已經低於它們定義爲列表1和列表2:
public class Foo
{
public int ID { get; set; }
public bool Enabled { get; set;}
}
public static class Data
{
public static IEnumerable<Foo> List1
{
get
{
return new List<Foo>
{
new Foo {ID = 1, Enabled = true},
new Foo {ID = 2, Enabled = true},
new Foo {ID = 3, Enabled = true}
};
}
}
public static IEnumerable<Foo> List2
{
get
{
yield return new Foo {ID = 1, Enabled = true};
yield return new Foo {ID = 2, Enabled = true};
yield return new Foo {ID = 3, Enabled = true};
}
}
}
現在考慮下面的測試:
IEnumerable<Foo> listOne = Data.List1;
listOne.Where(item => item.ID.Equals(2)).First().Enabled = false;
Assert.AreEqual(false, listOne.ElementAt(1).Enabled);
Assert.AreEqual(false, listOne.ToList()[1].Enabled);
IEnumerable<Foo> listTwo = Data.List2;
listTwo.Where(item => item.ID.Equals(2)).First().Enabled = false;
Assert.AreEqual(false, listTwo.ElementAt(1).Enabled);
Assert.AreEqual(false, listTwo.ToList()[1].Enabled);
這兩種方法似乎做「相同」的事情。
爲什麼在測試代碼中的第二個斷言失敗?
爲什麼listTwo的第二個「富」項目沒有得到設置爲false時,它是那麼listOne?
注意:我解釋了爲什麼允許這種情況發生,以及兩者的區別。不知道如何解決第二個斷言,因爲我知道如果我添加一個ToList調用List2它將工作。
感謝您的所有答案。我很清楚發生了什麼。我經過一些不同的解釋來清除它!乾杯! – Michael 2009-06-25 22:47:51