IEnumerable
是延迟计算的查询。但显然我的理解有点缺陷。我希望以下内容起作用:
// e.Result is JSON from a server
JObject data = JObject.Parse(e.Result);
JsonSerializer serializer = new JsonSerializer();
// LINQ query to transform the JSON into Story objects
var stories = data["nodes"].Select(
obj => obj["node"]).Select(
storyData => storyOfJson(serializer, storyData));
// set a value on each story returned by the query
foreach (Story story in stories)
{
story.Vid = vid;
}
// run through the query again, making sure the value was actually set
foreach (Story story in stories)
{
// FAILS - story.VID is 0
Debug.Assert(story.Vid == vid);
}
我在这里误解了什么?如何更改此查询返回的结果?
最佳答案
每次您枚举stories
变量时,Select
调用都会再次运行,创建一组新的Story
对象。
因此,每个 foreach
循环都在一组不同的 Story
实例上运行。
您需要通过调用 .ToArray()
强制 LINQ 调用只计算一次。
遍历生成的数组不会重新评估 LINQ 调用(因为它是一个普通数组),因此您将共享同一组 Story
实例。
关于c# - 对 IEnumerable 的更改不会在查询之间保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4083771/