В Powershell, как я могу создать HashSet с конструктором, принимающим коллекцию? - PullRequest
0 голосов
/ 31 декабря 2018

Я хочу создать 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:\>

Есть ли способсделать это?

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Я возился с этим, и кажется, что это работает:

[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[], и это именно то, чего хочет конструктор.

Надеюсь, что это поможет

0 голосов
/ 01 января 2019

очевидно, что вы не можете добавить всю коллекцию в HashSet как таковую.[ frown ] вам нужно перебрать коллекцию и использовать метод .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

output ...

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     HashSet`1                                System.Object
========================================
10
========================================
.csv
.zip
.txt
.json
.log
.ini
.tmp
.bmp
.js
.ani
========================================
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...