2015-03-19 4 views
5

У меня есть функцию PowerShell следующим образом:HashSet в Powershell: Коллекция была фиксированного размера

Function GetAllIdentityProvidersFromDatabase { 

    param (
     [string] $SQLConnectionSting 
    ) 

    $AllIdPIdentifiers = New-Object 'System.Collections.Generic.HashSet[string]' 
    $SQLConnect = new-object system.data.sqlclient.sqlconnection $SQLConnectionSting 

    try { 
     $SQLQuery = $("SELECT [IdPIdentifier] FROM [dbo].[IdPs]") 


     $SQLConnect.Open() 

     $command = New-object system.data.sqlclient.SqlCommand 
     $command.connection = $SQLConnect 
     $command.CommandText = $SQLQuery 
     $Reader = $command.ExecuteReader() 
     while ($Reader.Read()) { 
      $value = $Reader.GetValue($1) 
      $AllIdPIdentifiers.Add($value) | Out-Null 
     } 

     $AllIdPIdentifiers 

    } catch { 
     Write-Host "SQL Select error: " $Error[0].ToString() -ForegroundColor Red 
    } finally { 
     $SQLConnect.Close() 
    } 
} 

Затем в другой сценарий:

$AllIdPIdentifiers = New-Object 'System.Collections.Generic.HashSet[string]' 
$AllIdPIdentifiers = GetAllIdentityProvidersFromDatabase $SQLConnectionString 
$AllIdPIdentifiers.Remove("GodspeedYou") 
Write-Host $AllIdPIdentifiers.Count 

И, выполнив его, у меня есть эта ошибка:

Exception calling "Remove" with "1" argument(s): "Collection was of a fixed size." 
At C:\PowerShell\EduGain\FederationMetadataExtractor.ps1:151 char:1 
+ $AllIdPIdentifiers.Remove("GodspeedYou") 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : NotSupportedException 

Есть ли способ разрешить Remove работа?

+2

'GetAllIdentityProvidersFromDatabase' возвращает не' HashSet', а 'string', который будет упакован в массив, если более одного. И массивы фиксированного размера. – PetSerAl

+0

@PetSerAl: при условии, что вы правы, было бы полезно, если бы вы уточнили, что _why_ функция возвращает массив объектов 'string'. Учитывая, что функция, как представляется, оценивает значение '$ AllIdPIdentifiers' и ссылается на объект' HashSet ', мое наивное чтение кода заключается в том, что сама функция вернет объект' HashSet '. Есть ли способ заставить функцию PowerShell возвращать фактический объект 'HashSet ', если не код, показанный OP? –

+1

Невозможно ли заполнить HashSet вместо массива, используя возвращаемое значение моей функции? Это необходимо для использования структуры данных, которая минимизирует усилия по операциям «Содержит» и «Удалить». – vdenotaris

ответ

4

При передаче коллекции по конвейеру он перечисляется и передается каждый отдельный элемент. Если вы хотите передать коллекцию как единый элемент, вам следует собрать коллекцию в другую коллекцию. Unary , создать массив с одним элементом.

Function GetAllIdentityProvidersFromDatabase { 

    param (
     [string] $SQLConnectionSting 
    ) 

    $AllIdPIdentifiers = New-Object 'System.Collections.Generic.HashSet[string]' 
    $SQLConnect = new-object system.data.sqlclient.sqlconnection $SQLConnectionSting 

    try { 
     $SQLQuery = $("SELECT [IdPIdentifier] FROM [dbo].[IdPs]") 


     $SQLConnect.Open() 

     $command = New-object system.data.sqlclient.SqlCommand 
     $command.connection = $SQLConnect 
     $command.CommandText = $SQLQuery 
     $Reader = $command.ExecuteReader() 
     while ($Reader.Read()) { 
      $value = $Reader.GetValue($1) 
      $AllIdPIdentifiers.Add($value) | Out-Null 
     } 

     ,$AllIdPIdentifiers 

    } catch { 
     Write-Host "SQL Select error: " $Error[0].ToString() -ForegroundColor Red 
    } finally { 
     $SQLConnect.Close() 
    } 
} 
Смежные вопросы