2012-02-03 15 views
11

私はpowershellの初心者で、C#は適度にうまくいます。最近、私はこのPowerShellスクリプトを書いていて、ハッシュセットを作りたがっていました。だから私は書いた($ azAzは配列である)Powershellの配列引数を使用してコンストラクタを呼び出す

と押された。その後

New-Object : Cannot find an overload for "HashSet`1" and the argument count: "52". 
At filename.ps1:10 char:55 
+ [System.Collections.Generic.HashSet[string]]$allset = New-Object System.Collecti ... 
+              ~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [New-Object], MethodException 
    + FullyQualifiedErrorId :   ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand 

、私は配列パラメータでPowerShellでコンストラクタをGoogleで検索してにコードを変更:私はこのメッセージが表示されましたどういうわけか

[System.Collections.Generic.HashSet[string]]$allset = New-Object System.Collections.Generic.HashSet[string](,$azAZ) 

、私は今、このメッセージが表示されます。

New-Object : Cannot find an overload for "HashSet`1" and the argument count: "1". 
At C:\Users\youngvoid\Desktop\test5.ps1:10 char:55 
+ [System.Collections.Generic.HashSet[string]]$allset = New-Object System.Collecti ... 
+              ~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [New-Object], MethodException 
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand 

HashSetと引数count 1のオーバーロードが見つかりませんか?私をからかってるの?ありがとう。

+0

なぜにカンマ(、$ azAZ)?? –

+0

私は知らない、私はGoogleの検索からそれを得た。私は記事を読んだこともなく、少なくとも$ azAZを1つの引数として扱うためにはpowershellを持っていました。おそらくカンマが別の引数を示しているからでしょうか? – irisjay

+0

コンマは配列作成演算子であるため、$ azAZを$ azAZという単一要素の配列にします。@($ azAZ)は配列の配列を作成する明確な方法です。 – Massif

答えて

18

これは動作するはずです:

[System.Collections.Generic.HashSet[string]]$allset = $azAZ 

UPDATE:

を、配列は強く型付けされなければならないコンストラクタで配列を使用するには。このような

[string[]]$a = 'one', 'two', 'three' 
$b = 'one', 'two', 'three' 

# This works 
$hashA = New-Object System.Collections.Generic.HashSet[string] (,$a) 
$hashA 
# This also works 
$hashB = New-Object System.Collections.Generic.HashSet[string] (,[string[]]$b) 
$hashB 
# This doesn't work 
$hashB = New-Object System.Collections.Generic.HashSet[string] (,$b) 
$hashB 
+0

ありがとうございました。とにかく、私のコードには何の間違いがありましたか? – irisjay

+0

私はコレクションを初期化するのがC#3で追加された構文的な砂糖だったと思います。コンパイラは最初にコレクションを作成し、その背後に要素を追加します。 PowerShellにはこれに関する構文がありません。 – Rynant

+0

ハッシュセットクラスには1つの引数を持つコンストラクタHashSet (IEnumerable )が含まれており、msdnをチェックするだけです。 – irisjay

1

試し:ここでは一例である

C:\> $allset = New-Object System.Collections.Generic.HashSet[string] 
C:\> $allset.add($azAZ) 
True 
+0

メソッドも機能しますが、しかし、私は、ハッシュセットコンストラクタを使用することを意図しました。あなたのメソッドは、しかし、かなりエレガントです – irisjay

+0

あなたの$ allset.add($ azAZ)は、$ azAZのすべての要素を1要素として追加します!ここで何か間違いは間違いありません。 – irisjay

+0

はい、add()はこれを行います。私はあなたのニーズを誤解しました。 arry値からHasSetを取り込む正しい方法は、Rynantの答えです。 –

関連する問題