2012-09-17 77 views
3

我經常需要從基於一些條件,我每次和了這個集合中刪除某些對象:從集合中刪除項目的建議方法是什麼?

Get-SomeCollection | ? { $_.SomeProperty -eq "SomeValue" } | % { $_.Delete() } 

但是,這將只刪除第一個元素,然後拋出一個異常「集合被修改。 ..bla bla ...「。我明白了這個例外,但是這是什麼建議?

我通常使用一些陣列itemsToDelete,然後我通過數組再次重複並執行刪除操作:

$itemsToDelete = @() 
Get-SomeCollection | ? { $_.SomeProperty -eq "SomeValue" } | % { $itemsToDelete += $_ } 
$itemsToDelete | % { $_.Delete() } 

我想知道這是否是足夠好或有什麼更好的辦法。

+0

我不熟悉使用PowerShell。我在泛型方面也有類似的問題。也許這會有所幫助。 http://stackoverflow.com/questions/2995811/removing-items-from-a-generic-listt – frosty

回答

4

你通常會做的是使用過濾器實際上過濾器項目集合。所以,你不要修改原來的集合,而是簡單地過濾掉那些你感興趣的內容。

Get-SomeCollection | ? { $_.SomeProperty -ne "SomeValue" } 

如果您需要調用你要刪除的項目的操作,你可以簡單地創建的副本過濾的集合並枚舉該集合。這樣做,這是非常簡單的,因爲你只需要括在括號中的表現,使其評估與命令運行統計前:

(Get-SomeCollection | ? { $_.SomeProperty -eq "SomeValue" }) | % { $_.Delete() } 
+0

嗯,這是優雅的,但不適合我的大多數情況,因爲大部分時間我真的需要調用刪除操作執行更多操作,不僅從集合中移除(即從Web頁面移除WebPart)。 – jumbo

+0

更新了我的答案。 – poke

+0

哇!我知道這是隱藏在我的某個地方!感謝您爲我揭曉!太好了! – jumbo

0

我不知道該語法的PowerShell的,但這個問題的存在在.NET中使用簡單的foreach語句

解決方案是在for循環中向後迭代。

而不是做的:

foreach(var item in collection) 
{ 
    if(condition) 
    { 
     collection.Remove(item); //exception! 
    } 
} 

你這樣做:

for(int count = collection.Count - 1; count > 0; count--) 
{ 
    var currentItem = collection[count]; 
    if(condition) 
    { 
     collection.RemoveAt(count); 
    } 
} 
+0

是的,這是我的確切問題。但我的例子與在PowerShell中使用管道有關係。我想知道是否有使用原始管道的解決方案。或者更優雅的東西...... – jumbo

相關問題