为什么在 foreach 中对 Linq 分组选择所做的更改会被忽略,除非我添加 ToList()?

2023-12-10

我有以下方法。

public IEnumerable<Item> ChangeValueIEnumerable()
    {
        var items = new List<Item>(){
            new Item("Item1", 1),
            new Item("Item2", 1),
            new Item("Item3", 2),
            new Item("Item4", 2),
            new Item("Item5", 3)
        };

        var groupedItems = items.GroupBy(i => i.Value)
            .Select(x => new Item(x.First().Name, x.Key));

        foreach (var item in groupedItems)
        {
            item.CalculatedValue = item.Name + item.Value;
        }

        return groupedItems;
    }

进入groupedItems收集的CalculatedValues 为空。但是如果我添加一个ToList() to the Select后的句子GroupBy the CalculatedValues 有值。 例如:

 var groupedItems = items.GroupBy(i => i.Value)
            .Select(x => new Item(x.First().Name, x.Key)).ToList();

所以,问题是。为什么是这样?我想知道这样做的原因,对我来说解决方案是添加一个ToList()

更新:定义Item类如下

 public class Item
{
    public string Name { get; set; }
    public int Value { get; set; }

    public string CalculatedValue { get; set; }

    public Item(string name, int value)
    {
        this.Name = name;
        this.Value = value;
    }
}

var groupedItems = items.GroupBy(i => i.Value)
    .Select(x => new Item(x.First().Name, x.Key));

Here, groupedItems实际上并没有容纳任何物品。这IEnumerable<T>由返回Select代表一个计算——准确的说,代表的是映射的结果items通过应用函数到一组新的项目x => new Item(x.First().Name, x.Key).

每次迭代时groupedItems,将应用该函数并创建一组新的项目。

var groupedItems = items.GroupBy(i => i.Value)
    .Select(x => 
    {
        Console.WriteLine("Creating new item");
        return new Item(x.First().Name, x.Key));
    }

foreach(var item in groupedItems);
foreach(var item in groupedItems);

例如,此代码将为中的每个项目打印两次“Creating new item”items.

在您的代码中,您正在设置CalculatedValue of an 短暂的物品。当 foreach 循环完成后,这些项目就消失了。

通过致电ToList,您将“计算”转变为实际的项目集合。

而不是打电话ToList,您也可以创建另一种计算代表一组新的项目及其CalculatedValue属性集。这是功能性的 way.

Func<Item, Item> withCalculatedValue =
    item => {
        item.CalculatedValue = item.Name + item.Value;
        return item;
    };

return items.GroupBy(i => i.Value)
        .Select(x => new Item(x.First().Name, x.Key))
        .Select(withCalculatedValue);

或者简单地使用对象初始值设定项

return items.GroupBy(i => i.Value)
        .Select(x => new Item(x.First().Name, x.Key) { CalculatedValue = x.First().Name + x.Key });

如果您想对进行计算的对象主题进行更多研究,请搜索术语“Monad”,但要做好被混淆的准备。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 foreach 中对 Linq 分组选择所做的更改会被忽略,除非我添加 ToList()? 的相关文章

  • 有没有办法为向量采用内存资源?

    我已经开始在我的项目中使用 pmr allocators 并且我已经看到使用它们带来了很多性能提升和优势 我使用的分配器与我在下面的简单示例中展示的非常相似 include
  • 到底什么是“位填充”或“填充位”?

    我只是在互联网上找不到任何关于 位填充 真正含义的详细解释 并且在 Stack Overflow 上也没有找到与位填充相关的线程的任何答案 我还搜索了 ISO 9899 1990 其中提到了 位填充 但没有根据我的需要进行解释 我在网上找到
  • 在静态断言和运行时错误之间自动选择

    我有一个执行除法并检查对齐的宏 define BYTES TO WORDS x CHECK ALIGNMENT x 2 x 2 我想实施CHECK ALIGNMENT作为一个总是返回 1 的宏 并且如果满足以下条件则触发错误x不除以 2 宏
  • System.MissingMethodException:找不到方法?

    以前工作的 ASP NET WebForms 应用程序现在抛出此错误 System MissingMethodException 找不到方法 The DoThis方法位于同一个类上 它应该可以工作 我有一个这样的通用处理程序 public
  • 如何在函数中将结构成员作为指针传递?

    问题是我有一个结构是另一个 主要 结构的成员 我编写了一个函数来清除第一个结构 它需要一个指向结构的指针 我想使用该函数来清除主要结构内的结构 但我不确切知道哪种方法是正确的 为了更好地解释它 这里有一些代码 我有一个结构 定义为 type
  • Rx Framework:在超时时执行操作,而不中断原始可观察序列

    给定一个可观察的源 通过轮询低级设备的 变化 状态生成 observable source metacode IObservable
  • C++ 中的字符串到 LPCWSTR

    我正在尝试从字符串转换为 LPCWSTR 我使用多位 1 例如 LPCWSTR ToLPCWSTR string text LPCWSTR sw LPCWSTR text c str return sw 2 返回中文字符 LPCWSTR T
  • 为什么 CMake 不通过在定义该变量之前创建的 CMAKE_CXX_STANDARD 将语言标准编译标志添加到目标?

    我在用着cmake version 3 22 1 and c Ubuntu 11 3 0 1ubuntu1 22 04 11 3 0 以及非常简约的CMakeLists txt 我无法让 CMAKE 使用 C 20 Setting set
  • 将 gcov 与 CMake/CDash 结合使用的详细指南?

    我在我的项目中使用 CMake 并设置了 cdash 服务器以进行连续 夜间构建 一切运行良好 通过设置 crontab 我们可以将每小时 每晚的构建 测试结果自动上传到我们的 cdash 服务器 我的下一步是将测试覆盖率报告添加到构建中
  • C# 列表框 ObservableCollection

    我正在尝试使用 ListBox DataSource ObservableCollection 但是我不知道如何在 OC 更新时让列表框自动更新 我可以在 OC 上挂接 CollectionChanged 事件 但是我需要对列表框执行什么操
  • 如何从c++调用python

    我是Python新手 我尝试像这样从 C 调用 python 脚本 在 Raspberry Pi 中 std string pythonCommand python Callee py a b int res system pythonCo
  • 为什么long long 2147483647 + 1 = -2147483648? [复制]

    这个问题在这里已经有答案了 为什么这段代码不打印相同的数字 long long a b a 2147483647 1 b 2147483648 printf lld n a printf lld n b 我知道int变量的最大数量是2147
  • C#中如何将委托转换为对象?

    我正在使用反射类来调用其他 dll 上的一些方法 方法的参数之一是委托类型 我想通过使用反射来调用这个方法 所以我需要将函数参数作为对象数组传递 但我找不到任何关于 如何将委托转换为对象 提前致谢 委托是一个对象 只需像平常一样创建预期的委
  • STL 向量、迭代器和插入 (C++)

    我有一个将向量的迭代器传递到的方法 在这个方法中 我想向向量中添加一些元素 但我不确定当只有迭代器时这是否可行 void GUIComponentText AddAttributes vector
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • 更改预处理到文件后出现错误 1 ​​错误 LNK1104

    我必须使用预处理器 所以我改变了 配置属性 gt C gt 预处理器 gt 预处理为文件 gt 是 并得到错误 错误 1 错误 LNK1104 无法打开文件 Debug asnreal obj 这个问题的解决办法 我必须在 lib 文件的路
  • C中的pipe()和fork()

    我需要创建两个子进程 一个子进程需要运行命令 ls al 并将其输出重定向到下一个子进程的输入 而下一个子进程又将对其输入数据运行命令 sort r n k 5 最后 父进程需要读取该数据 已排序的数据 并将其显示在终端中 终端中的最终结果
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind
  • GetActiveObject() 与 GetObject() -- MK_E_UNAVAILABLE 错误

    All 我在将一些 VBA 代码转换为 C 时遇到一些问题 我们有一个充当本地 COM 服务器的第 3 方应用程序 在我们使用的VBA代码中获取对象 获取对现有对象的引用 e g Set appHandle GetObject ProgId

随机推荐

  • 将二维数组乘以一维数组

    我有一个形状为 k n 的二维数组 a 我想将其与形状为 m 的一维数组 b 相乘 a np array 2 8 4 7 1 2 5 2 7 4 b np array 3 5 5 作为 乘法 的结果 我正在寻找 array 2 3 2 5
  • 使用 MVVM 更改 ContentControl WPF 的内容?

    我正在开发一个使用 MVVM 和 WPF 的项目 但我遇到了困难 当我创建一个Button and a ContentControl在按钮更改内容的窗口中ContentControl 效果很好
  • 同时捕获并显示控制台输出

    MSDN 指出 在 NET 中可以捕获进程的输出and同时将其显示在控制台窗口中 通常当您设置 StartInfo RedirectStandardOutput true 控制台窗口保持空白 由于 MSDN 网站没有提供这方面的示例 我想知
  • 在 Django Channels 中重用现有的 websocket

    我正在半认真地使用 Python 在限制访问系统和 GAE 应用程序之间创建一种看门服务器 我将从一个更一般的问题开始 然后可能会转向与代码相关的特定问题 Overview 受限访问系统是使用命令行 Python 应用程序设置的 该应用程序
  • 如何在不使用正则表达式的情况下不区分大小写地搜索字符串?

    我想在文件中搜索包含给定字符串但不匹配大小写的所有行 如何使此代码不区分大小写 with open logfile as inf for line in inf if var in line print found line with op
  • 如何获取 CRTP 类型的通用类型定义

    鉴于以下情况CRTP在 C 中输入 public abstract class DataProviderBase
  • Guard let 错误:条件绑定的初始化程序必须具有可选类型而不是“字符串”

    我在使用guard let 时遇到致命错误 这是错误 条件绑定的初始化程序必须具有可选类型 而不是 细绳 下面是我使用过的代码 IBAction func signUpButtonPressed sender UIButton guard
  • Android支持线程吗?

    Android 支持 pthread 吗 为什么当我使用 pthread 选项时我看到链接器错误 i686 android linux bin ld 找不到 lpthread include
  • 如何检查 JellyBean 中的 Talkback 是否处于活动状态

    这个问题询问如何知道 Android Talkback 是否处于活动状态 这一直有效 直到果冻豆 从 Android 4 1 开始 该步骤不再起作用 因为提到的光标为空 话虽如此 我想问是否有办法在 Jelly Bean 中进行相同的检查
  • Excel 2013 强大查询 - 带有动态参数的 SQL 查询

    然而 我从网上查看 找不到一个简单的 示例来展示如何使用动态参数值并拥有一个在 WHERE 中使用动态参数值的 SQL 查询 我正在寻找的是 最终用户将能够更改电子表格 参数表 中的列中的值 并使用此新值作为参数刷新数据 也许一个例子最能描
  • 媒体查询:不起作用

    我正在使用 webpack 和较少的预处理器 我还包括media less文件位于底部main less 问题出在里面所有的样式 media标签被忽略 CSS代码 media all and min device width 414px a
  • 使用 MySQL 数据读取器

    我不熟悉使用数据读取器 我需要以下代码的帮助 我想从数据库中检索单个数据 MySqlDataAdapter data new MySqlDataAdapter cmd conn Open DataTable dt new DataTable
  • 从 XAML 调用位于类中的事件或方法

    您好 我正在尝试是否可以将像 TextChanged 文本框的 这样的事件放置在独立于窗口代码隐藏 如类 的另一个位置 我想做的是在 ResourceDictionary 中引用 TextBox 的事件 因为 ResourcesDictio
  • `nls` 无法估计我的模型的参数

    我正在尝试估计堆定律的常数 我有以下数据集novels colection Number of novels DistinctWords WordOccurrences 1 1 13575 117795 2 1 34224 947652 3
  • 会话之间的WCF数据持久化

    我们正在开发一个基于WCF 的系统 在此过程中 我们试图锁定某些数据 以免被多个用户修改 因此 我们决定建立一个数据结构 其中包含执行锁定逻辑所需的信息 例如存储锁定对象的 ID 我们遇到的问题是在会话之间保留该数据 我们是否可以避免执行昂
  • python“bigfloat”包安装问题

    我试图在我的 Mac OS X 10 8 4 上安装 bigfloat 包 但遇到了一些问题 包 bigfloat 需要另外两个依赖项 1 mpfr 和 2 gmp 我在这里安装了gmp http gmplib org 但安装 mpfr 并
  • 使用VBA将多个公式放入一个单元格中

    我正在开发一个宏 将多个公式放入一个单元格中 在本例中 它的 3 个 Bloomberg 公式被合并到一个单元格中 该公式在 Excel 中手动复制或键入时有效 但在 VBA 模块中键入时无效 它会产生错误 编译错误 预期 语句结束 并突出
  • 如何解决“接收失败:连接被对等方重置”错误

    我想 git pull or git fetch命令开启myRepo给我错误但是myTestRepo工作正常 命令给了我这个错误 Fetching origin fatal unable to access http mysite myPa
  • Mysql插入2个表

    我想插入两个表 visits visit id int card id int 登记 registration id int type enum in out timestamp int visit id int 我想要类似的东西 INSE
  • 为什么在 foreach 中对 Linq 分组选择所做的更改会被忽略,除非我添加 ToList()?

    我有以下方法 public IEnumerable