[arrays] Array.Add vs + =

PowerShell Arrays에서 배열을 다음과 같이 선언하면 흥미로운 동작을 발견했습니다.

$array = @()

그런 다음 $array.Add("item")방법을 사용하여 항목을 추가하려고 하면 다음 오류가 발생합니다.

“1”인수와 함께 “Add”호출 예외 : “Collection의 크기가 고정되었습니다.”

그러나를 사용하여 항목을 추가 $array += "item"하면 문제없이 항목이 허용되며 “고정 크기”제한이 적용되지 않는 것 같습니다.

왜 이런거야?



답변

$array.Add()-method를 사용할 때 기존 배열에 요소를 추가하려고합니다. 배열은 고정 된 크기의 모음이므로 확장 할 수 없기 때문에 오류가 발생합니다.

$array += $element이전 항목 + 새 항목과 동일한 요소로 배열을 작성 하고이 새 큰 배열은 $array-variable 에서 이전 항목을 대체합니다.

+ = 연산자를 사용하여 배열에 요소를 추가 할 수 있습니다. 이를 사용하면 Windows PowerShell은 실제로 원래 배열의 값과 추가 된 값으로 새 배열을 만듭니다. 예를 들어, 값이 200 인 요소를 $ a 변수의 배열에 추가하려면 다음을 입력하십시오.

    $a += 200

출처 : about_Arrays

+= 값 비싼 작업이므로 많은 항목을 추가해야하는 경우 가능한 적은 작업으로 항목을 추가해야합니다. 예 :

$arr = 1..3    #Array
$arr += (4..5) #Combine with another array in a single write-operation

$arr.Count
5

이것이 가능하지 않은 경우 List또는 보다 효율적인 콜렉션을 사용하는 것이 ArrayList좋습니다 (다른 답변 참조).


답변

동적 크기의 배열을 원한다면 목록을 만들어야합니다. .Add()@ frode-f에서 설명한 것처럼 기능 을 사용할 수있을뿐만 아니라 동적 배열은 메모리 효율성이 높고 더 나은 방법입니다.

그리고 사용하기 매우 쉽습니다.

배열 선언 대신 다음을 시도하십시오.

$outItems = New-Object System.Collections.Generic.List[System.Object]

항목을 추가하는 것은 간단합니다.

$outItems.Add(1)
$outItems.Add("hi")

그리고 당신이 정말로 배열을 원한다면, 그 기능도 있습니다.

$outItems.ToArray()


답변

비효율적 인 배열을 사용하지 않고 배열을 만드는 가장 일반적인 관용구 +=는 루프 출력에서 ​​다음과 같습니다.

$array = foreach($i in 1..10) {
  $i
}
$array


답변