我碰到一个有趣的问题今天在这里我有两个方法,快速浏览,都做同样的事情来了。这是返回一个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