使用Add()填充的String HashSet在PowerShell中无法用foreach迭代
解决PowerShell中HashSet无法正确迭代的问题
你这里的核心问题是把HashSet[string]和PowerShell里的键值对哈希表搞混啦!HashSet是专门用来存储唯一元素的集合,它不是键值对结构,所以压根没有Name、Value、Keys这些属性,也不存在Item索引器。咱们一步步理清楚问题出在哪,以及怎么解决:
先拆解你代码里的几个误区
- Add()方法的返回值干扰:你看到的前三个
True、True、False其实是Add()方法的返回结果——当元素不存在、添加成功时返回True,重复添加时返回False,这不是Contains的输出哦。如果不想看到这些返回值,可以用[void]$hashSet.Add("xxx")来忽略。 - 错误的迭代逻辑:
HashSet.GetEnumerator()返回的是集合里的每个字符串元素本身,不是带Name/Value的键值对象,所以$h.Name和$h.Value都是空值,才会输出:;另外HashSet本身就没有Keys属性,第二个循环自然拿不到任何内容。
正确的迭代写法
直接遍历HashSet本身就可以,因为它实现了IEnumerable接口,PowerShell会自动处理迭代逻辑:
$hashSet = New-Object 'System.Collections.Generic.HashSet[string]'; # 用[void]忽略Add的返回值,避免无关输出 [void]$hashSet.Add("hi"); [void]$hashSet.Add("hello"); [void]$hashSet.Add("hi"); # 方式1:直接foreach遍历HashSet(最简洁) foreach ($item in $hashSet) { Write-Host "唯一元素: $item" } # 方式2:用GetEnumerator()迭代,直接输出元素 foreach ($item in $hashSet.GetEnumerator()) { Write-Host "唯一元素: $item" } # 验证元素存在性 $hashSet.Contains("hi")
执行这段代码的输出会是:
唯一元素: hi 唯一元素: hello 唯一元素: hi 唯一元素: hello True
额外补充
如果你的需求是存储键值对数据,那应该用Hashtable或者System.Collections.Generic.Dictionary[string, string];但如果只是要存储不重复的字符串,HashSet[string]是完全合适的,只要记住它是单元素集合,不是键值对容器就行。
内容的提问来源于stack exchange,提问作者N. Raj
相关产品推荐
相关产品推荐

