如何编辑搜索返回的PowerShell数组项?

时间:2011-05-10 17:03:15

标签: 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"}

这似乎比进行强力搜索要好得多,但我现在不知道如何获得该记录。如果我在数组中有索引,那么我可以轻松地使用它来编辑我想要的值,那么有没有办法获得数组索引?这通常是怎么做的?感谢。

3 个答案:

答案 0 :(得分:6)

如果您控制$haystack的创建,并且$haystackitem.name始终是唯一的,我建议创建一个以Name作为索引的哈希表。

如果上述任何一种情况都不成立,则可以使用foreach ($object in $collection) {}来加快速度。您不需要对象的索引,因为对象将通过引用传递。您在对象中所做的任何更改都将在数组中看到。

但最好的表现是创建一些托管代码来对数组进行排序并使用有效的搜索算法。但那将是更多的工作。

答案 1 :(得分:0)

对象为每种方式执行a并且必须返回所有与您的测试条件匹配的项目。哈希的一般用例是拥有一个密钥,如果你不得不迭代你可能已经选择了一个糟糕的密钥,你可以用它来有效地找到你的对象。

答案 2 :(得分:0)

您可以通过执行以下类似的操作来遍历数组并检索数组中特定“name”属性值的索引:

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