查询之间不保留对IEnumerable的更改

Nic*_*ner 6 .net c# linq ienumerable

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);
        }
Run Code Online (Sandbox Code Playgroud)

我在这里误解了什么?如何更改此查询返回的结果?

SLa*_*aks 11

每次枚举stories变量时,Select调用都会再次运行,从而创建一组新Story对象.

因此,每个foreach循环都在不同的Story实例集上运行.

您需要通过调用强制LINQ调用只评估一次.ToArray().
循环生成的数组不会重新评估LINQ调用(因为它是一个普通的数组),所以你将共享同一组Story实例.

  • @Dennis:错了.每次使用新的枚举器时它都会再次运行.(结果不会缓存在任何地方) (4认同)
  • 请注意,使用任何集合类型都可以(即ToList()).+1. (3认同)