2011-05-10 49 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来过度优化该操作。我会坚持迭代并称它为好。 – 2011-05-10 19:49:30

回答

6

如果你控制着创建$haystack$haystackitem.name总是唯一的,我会建议创建一个名称为索引的散列表。

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

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

0

对象在哪里做每一种方法,因为它返回符合您的测试条件的所有项目。散列的通用用例就是要有一个可用于有效查找对象的密钥,如果您必须迭代也许您选择了一个不良密钥。

+0

好吧,好吧,如果where-object只是做了一个完整的迭代,那么我就不用费心去使用那个运算符。有没有比循环更有效的方法? – 2011-05-10 17:21:20

+0

只有当你有一个键,并使用某种排序的数据结构。例如哈希,或者你可以使用索引。 – rerun 2011-05-11 05:01:55

0

你可以通过遍历数组并做类似的事情检索特定的名字'属性数组中值的索引如下:

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