2011-05-10 3 views
4

해시 테이블에서 특정 항목의 값을 변경하려고합니다.검색에서 반환 된 PowerShell 배열 항목을 편집하는 방법?

for ($i=0; $i -le $haystack.length-1; $i++) 
    { 
     if ($haystack[$i].name -eq "needle") 
      { 
      $haystack[$i].currentstatus = "found" 
      } 
    } 

위의 코드는 작동하지만이 있어야한다 것처럼 보인다 조건과 같이 충족되면 그때, 특정 값마다 하나의 키를 테스트, 전체 개체를 통해 반복을 변경하여이 작업을 수행 할 수 있습니다 건초 더미가 크고 바늘이 하나 뿐인 경우 특히 작업을 수행하는보다 효율적인 방법입니다.

는 어디서 객체를 사용하려고하고 내가 찾고 기록을 찾을 수 있습니다

$haystack | where-object {$_.name -eq "needle"} 

이것은 무력 검색을하는 것보다 훨씬 더 나은 것을하지만 난 그 기록에 도착하는 방법을 모른다 지금. 배열에 인덱스가 있으면 원하는 값을 편집하는 데 쉽게 사용할 수 있으므로 배열 인덱스를 얻을 수있는 방법이 있습니까? 이것은 보통 어떻게 이루어 집니까? 감사.

+0

감사합니다. PowerShell에 데이터베이스 사고를 적용하여이 작업을 지나치게 최적화하려고하는 것 같습니다. 나는 단지 iterating을 고집하고 그것을 좋게 부를 것이다. –

답변

6

$haystack의 생성을 제어하고 $haystackitem.name이 항상 고유하면 Name을 색인으로 사용하여 해시 테이블을 만드는 것이 좋습니다.

위의 조건 중 하나라도 맞지 않으면 foreach ($object in $collection) {}을 사용하여 약간 속도를 높일 수 있습니다. 개체가 참조로 전달되므로 개체에 대한 인덱스가 필요하지 않습니다. 객체에 대한 모든 변경 사항은 배열 내에서 볼 수 있습니다.

그러나 최상의 성능은 배열을 정렬하고 효과적인 검색 알고리즘을 사용하는 관리 코드를 만드는 것입니다. 그러나 그것은 더 많은 일이 될 것입니다.

0

여기서 object는 각 방법에 대해 수행하며 테스트 조건과 일치하는 모든 항목을 반환하므로 수행해야합니다. 해시의 일반적인 사용 사례는 아마도 당신이 가난한 키를 선택했을 때 반복 할 필요가있을 때 효과적으로 객체를 찾는 데 사용할 수있는 키를 갖는 것입니다.

+0

좋아요, 어디서 객체가 전체 반복 만하고 있다면 그 연산자를 사용하여 신경 쓰지 않을 것입니다. 루핑하는 것보다 효율적인 방법이 있습니까? 키가 있고 일종의 정렬 된 데이터 구조를 사용하는 경우에만 –

+0

을 사용해야합니다. 예를 들어 해시 또는 색인을 사용할 수 있습니다. – rerun

0

당신은 배열을 통해 반복 다음과 같은 유사한 작업을 수행하여 배열에서 특정 '이름'속성 값에 대한 인덱스를 검색 할 수있는 옵션에 대한

$index = 0..($haystack.Count - 1) | Where {$haystack[$_].name -eq 'needle'} 
관련 문제