c# - 对 IEnumerable 的更改不会在查询之间保留

标签 c# .net 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);
        }

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

最佳答案

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

因此,每个 foreach 循环都在一组不同的 Story 实例上运行。

您需要通过调用 .ToArray() 强制 LINQ 调用只计算一次。
遍历生成的数组不会重新评估 LINQ 调用(因为它是一个普通数组),因此您将共享同一组 Story 实例。

关于c# - 对 IEnumerable 的更改不会在查询之间保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4083771/

相关文章:

c# - 在 EntityFramework 和 NHibernate 之间切换

.net - .NET 中如何实现值类型

c# - 如何通过 LINQ 选择队列中最常出现的值?

c# - 在 ASP.NET Identity Core 中,我可以更改 UserToken 主键吗

c# - 我可以在 C# 中将正则表达式与 String.Replace 一起使用吗?

c# - UWP - 按下空格时不要触发 Click 事件(就像在电影和电视应用中一样)

.net - 如何在 .NET 中暂停垃圾回收?

c# - 如何从给定日期查找当年的日期名称?

c# - LINQ 加入多个 From 子句

c# - LINQ 多重连接与一个左连接