我想使用the constructor accepting a collection来创建HashSet
但是我的尝试都没有成功:
C:\> $c = @(1,2,3,4,5)
C:\> New-Object System.Collections.Generic.HashSet[int]
C:\> New-Object System.Collections.Generic.HashSet[int] -ArgumentList @(,$c)
New-Object : Cannot find an overload for "HashSet`1" and the argument count: "1".
At line:1 char:1
+ New-Object System.Collections.Generic.HashSet[int] -ArgumentList @(,$ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
C:\> New-Object System.Collections.Generic.HashSet[int] -ArgumentList $c
New-Object : Cannot find an overload for "HashSet`1" and the argument count: "5".
At line:1 char:1
+ New-Object System.Collections.Generic.HashSet[int] -ArgumentList $c
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
C:\> New-Object System.Collections.Generic.HashSet[int] -ArgumentList @($c)
New-Object : Cannot find an overload for "HashSet`1" and the argument count: "5".
At line:1 char:1
+ New-Object System.Collections.Generic.HashSet[int] -ArgumentList @($c ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
C:\>
有办法吗?
答案 0 :(得分:0)
我一直在摆弄这个,看来这可行:
[int[]]$c = 1,2,3,4,5
[System.Collections.Generic.HashSet[int]]::new([System.Collections.Generic.IEnumerable[int]]$c)
您甚至可以在这里省略[System.Collections.Generic.IEnumerable[int]]
部分,然后直接执行
[int[]]$c = 1,2,3,4,5
[System.Collections.Generic.HashSet[int]]::new($c)
没有,将数组声明为[int[]]
无效,并且会出现错误消息
无法转换类型为“ System.Object []”的“ System.Object []”值 键入“ System.Collections.Generic.IEnumerable`1 [System.Int32]”。
使用类型转换[int[]]
,变量c$
的类型为System.Int32[]
,而不仅仅是System.Object[]
,而这正是构造函数想要的
希望有帮助
答案 1 :(得分:0)
我知道这有点老了,但是您可以将列表投射到集合中
> $fileTypes = [System.Collections.Generic.HashSet[String]] @(".jpg", ".txt", ".log", ".ini")
> $fileTypes
.jpg
.txt
.log
.ini
> $fileTypes.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True HashSet`1 System.Object
> $fileTypes.Contains(".ini")
True
答案 2 :(得分:-1)
显然,您不能像这样将整个集合添加到HashSet中。 [皱眉],您需要遍历集合并使用.Add()
方法。如果您直接添加集合 ,则整个集合将作为集合中的一个项获得。哎哟!
所以您需要这样的东西
$HashSetTest = [System.Collections.Generic.HashSet[string]]::new()
$FileExtList = (Get-ChildItem -LiteralPath $env:TEMP -File).Extension
$FileExtList.Where({$_}).ForEach({[void]$HashSetTest.Add($_)})
$HashSetTest.GetType()
'=' * 40
$HashSetTest.Count
'=' * 40
$HashSetTest
'=' * 40
输出...
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True HashSet`1 System.Object
========================================
10
========================================
.csv
.zip
.txt
.json
.log
.ini
.tmp
.bmp
.js
.ani
========================================