c# – 为什么在使用foreach时LINQ查询不执行?
在LINQ语句中创建新对象时,例如:
var list = new List<string>() { "a","b","c" }; var created = from i in list select new A(); A类看起来像这样: class A { public string Label; } 然后用foreach循环修改A中的属性: foreach (var c in created) { c.Label = "Set"; } 为什么以后在IEnumerable中访问对象时没有设置值.例如.以下断言失败: Assert.AreEqual("Set",created.ElementAt(2).Label); 我不知道为什么会发生这种情况.我期望foreach-statement执行查询,并触发对象的创建. MSDN文档规定:“Execution of the query is deferred until the query variable is iterated over in a foreach or For Each loop”. 我已经用.NET 4.5和Mono 3.2.0转载了这个行为.在访问创建的对象之前,在IEnumerable上调用ToList会使此问题消失. 解决方法
这是因为创建的是查询,而不是结果.所以,每次你列举它,你都从头开始评估选择.
如果你想要这个工作,创建一个实际的列表,而不是只是一个表示一个查询的IEnumerable. 例如,添加: created = created.ToList(); 你说:
这正是发生了什么.问题是每次迭代创建的对象的创建,而不仅仅是第一次.由于ElementAt()方法迭代创建,它只是再次创建新的As. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – Rails Mailer Ubuntu
- c# – HttpContext.Current.Session始终为空
- ajax核心技术---XMLHttpRequset对象的使用
- oracle分析函数技术详解(配上开窗函数over())
- objective-c – 缺少@end预期标识符“{”XCode 4.2 .h模块中
- ruby-on-rails – 为什么Object ::如果发送到nil对象的话会
- flex 在viewstack里使用AdvancedDataGrid,出现错误解决办法
- 在Ruby中,这种结构意味着什么?
- fastjson 常用api
- c# – 如何使用Unity处理IDisposable存储库?