2012-02-03 3 views
11

저는 powershell의 초보자이며 C#이 적당하다는 것을 알고 있습니다. 최근 필자는이 powershell 스크립트를 작성하여 Hashset을 만들고 싶었습니다. 그래서 나는 썼다. ($ azAz는 배열이다.)Powershell의 배열 인수로 생성자를 호출합니다.

그리고 누름. 나는이 메시지를 가지고 :

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 

: 지금이 메시지가, 어떻게 든

[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: "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에서 생성자를 봤와에 코드를 변경 HashSet 및 인수 개수 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 응답에 있습니다. –

관련 문제