为何无法用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
相关产品推荐
相关产品推荐

