2015-03-19 13 views
5

Mam PowerShell funkcję w następujący sposób:HashSet w PowerShell: Kolekcja było stałej wielkości

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() 
    } 
} 

Następnie w innym skrypcie:

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

A wykonując go, mam ten błąd:

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 

Czy istnieje sposób, aby zezwolić na Remove operacja?

+2

'GetAllIdentityProvidersFromDatabase' zwraca nie' HashSet', ale 'string's, który zostanie spakowany w tablicy, jeśli jest więcej niż jeden. A tablice mają stały rozmiar. – PetSerAl

+0

@PetSerAl: zakładając, że masz rację, byłoby pomocne, gdybyś opracował na _ dlaczego ta funkcja zwraca tablicę obiektów 'string'. Zważywszy, że funkcja wydaje się oceniać na wartość '$ AllIdPIdentifiers' i odwołuje się do obiektu' HashSet ', moje naiwne odczytywanie kodu jest takie, że sama funkcja zwróci obiekt' HashSet '. Czy istnieje sposób, aby funkcja PowerShell zwróciła rzeczywisty obiekt 'HashSet ', jeśli nie jest to kod pokazany w OP? –

+1

Czy nie można wypełnić obiektu HashSet zamiast tablicy przy użyciu zwróconej wartości funkcji? Ma to na celu wykorzystanie struktury danych, która minimalizuje nakład pracy w operacjach "Zawiera" i "Usuwa". – vdenotaris

Odpowiedz

4

Podczas przekazywania kolekcji przez potok, jest ona wyliczana i każdy pojedynczy element jest przekazywany. Jeśli chcesz przekazać kolekcję jako pojedynczy element, powinieneś spakować kolekcję do innej kolekcji. Unary , tworzy tablicę z pojedynczym elementem.

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() 
    } 
} 
Powiązane problemy