在Powershell中,如何使用构造函数接受集合来创建HashSet?

时间:2018-12-31 18:33:11

标签: powershell hashset

我想使用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:\>

有办法吗?

3 个答案:

答案 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
========================================