Как редактировать элемент массива PowerShell, возвращаемый поиском? - PullRequest
4 голосов
/ 10 мая 2011

Я пытаюсь изменить значение определенного элемента в хэш-таблице. Я могу сделать это, выполняя итерацию по всему объекту, проверяя каждый отдельный ключ на определенное значение, а затем изменяя его, если выполняется условие следующим образом:

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

Приведенный выше код работает, но, похоже, должен быть более эффективный способ решения этой задачи, особенно когда стог сена большой и в нем только одна игла.

Я попытался использовать where-object и смог найти нужную запись:

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

Это кажется намного лучше, чем поиск грубой силы, но я не знаю, как получить эту запись сейчас. Если бы у меня был индекс в массиве, я мог бы легко использовать его для редактирования нужного значения, так есть ли способ получить индекс массива? Как это обычно делается? Спасибо.

Ответы [ 3 ]

6 голосов
/ 10 мая 2011

Если вы управляете созданием $haystack, а $haystackitem.name всегда уникален, я бы предложил создать хеш-таблицу с именем в качестве индекса.

Если какое-либо из приведенных выше условий не выполняется, выможно немного ускорить процесс, используя вместо этого foreach ($object in $collection) {}.Вам не нужен индекс для объекта, потому что объекты будут переданы по ссылке.Любые изменения, которые вы вносите в объект, будут видны в массиве.

Но наилучшим результатом будет создание управляемого кода для сортировки массива и использования эффективного алгоритма поиска.Но это было бы больше работы.

0 голосов
/ 10 мая 2011

Вы можете выполнить итерацию по массиву и получить индекс для определенного значения свойства 'name' в массиве, выполнив нечто похожее на следующее:

$index = 0..($haystack.Count - 1) | Where {$haystack[$_].name -eq 'needle'}
0 голосов
/ 10 мая 2011

Где объект выполняет a для любого способа и должен, так как он возвращает все элементы, которые соответствуют условиям вашего теста. Общий вариант использования хэша - иметь ключ, который вы можете использовать для эффективного поиска вашего объекта, если вам приходится повторять, возможно, вы выбрали плохой ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...