Как отредактировать элемент массива PowerShell, возвращенный поиском?

#powershell

#powershell

Вопрос:

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

 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"}
  

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

Комментарии:

1. Спасибо за варианты. Похоже, я пытаюсь чрезмерно оптимизировать эту операцию, пытаясь применить к PowerShell подход к базе данных. Я буду придерживаться простой итерации и назову это хорошим.

Ответ №1:

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

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

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

Ответ №2:

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

Комментарии:

1. Хорошо, хорошо, если where-object просто выполняет полную итерацию, тогда я не буду утруждать себя использованием этого оператора. Есть ли более эффективный способ, чем зацикливание?

2. только если у вас есть ключ и вы используете какую-то отсортированную структуру данных. Например, хэш или вы можете использовать индекс.

Ответ №3:

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

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