You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法用LINQ的Select()遍历字符串并向HashSet添加字符?

问题原因及解决方案

你的代码里HashSet为空的核心原因是LINQ的延迟执行特性:

  • Select是LINQ的延迟查询操作符,它不会立即执行传入的委托逻辑,只是定义了一个待执行的查询计划。只有当你枚举这个查询的结果时(比如遍历、调用ToList()/ToArray()等),里面的chars2.Add(l)才会真正被调用。
  • 你当前的代码只是定义了查询,没有触发执行,所以Add方法一次都没运行,HashSet自然是空的。

正确的解决方式

方式1:直接遍历字符串(推荐,符合常规编码习惯)

放弃用LINQ做副作用操作,直接用foreach遍历字符串并添加字符:

HashSet<char> chars2 = new HashSet<char>();
foreach (char c in myString)
{
    chars2.Add(c);
}

方式2:强制触发LINQ查询执行(不推荐,可读性差)

如果一定要用LINQ写法,需要调用能强制枚举查询结果的方法(比如ToList()),触发Add逻辑执行:

HashSet<char> chars2 = new HashSet<char>();
myString.Select(l => chars2.Add(l)).ToList();

这种写法不推荐,因为LINQ的设计初衷是查询数据,而非执行修改外部状态的副作用操作,会让代码意图不清晰。

方式3:使用HashSet构造函数(最简洁高效)

HashSet的构造函数本身就支持传入IEnumerable<char>类型的参数,直接把字符串传进去即可完成初始化:

HashSet<char> chars2 = new HashSet<char>(myString);

这是最优解,代码简洁且性能高效。

内容的提问来源于stack exchange,提问作者Adwad ddw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:10:45