我正在使用linq通过一个门面对象通过Id选择一堆对象。这个门面有一个函数GetObjectById(string id)
它返回一个MyObject。我选择基于ID的列表上一个查询一堆对象:Linq到对象不“持续”的变化
IEnumerable<MyObject> objects =
from id in ids
select facade.GetObjectById(id);
再后来我把我的对象一定的价值,像这样:
foreach(MyObject object in objects)
{
object.someValue = "banaan";
}
后来当我检查对象的IEnumerable, someValue
未设置为“banaan”。
它看起来像它与linq的延期执行有关,因为当我把.ToList()
放在第一个查询后面时我确实有效。但是,我认为我应该可以做这样的事情。我在这里做错了什么?或者是我的理解你应该如何使用linq错误?
在此先感谢。
但是,这不是我的清单的副本?我有几个这样的功能,互相呼叫。即GetObjectsById(IEnumerable ID)调用GetObjectById。它会每次都被复制,并会打破延期执行的好处吗?我认为延期执行并不意味着:每次执行都重复执行。 –
2011-05-24 12:39:57
如果没有ToArray/ToList,实际上根本没有任何列表,只是重新创建枚举的一种方式。当您最多一次迭代集合时,您只能从延迟执行中获益。 – CodingInsomnia 2011-05-24 12:45:14
顺便说一句,如果你想真正理解LINQ以及幕后发生了什么,我推荐阅读Jon Skeets Edulinq系列博客文章(现在可用电子书格式):http://msmvps.com/blogs/jon_skeet/archive /2011/03/18/edulinq-the-e-book.aspx – CodingInsomnia 2011-05-24 12:54:10