2012-11-15 29 views
0

我敢肯定,在某些時候我們都這樣寫的一些代碼:當您在枚舉中刪除某個項目時,ReSharper是否會查找?

For Each datVehicle In datVehicles 
    If datVehicle.ID = -1 Then 
    datVehicles.Remove(datVehicle) 
    End If 
Next 

哪個編譯得很好,但拋出的運行時異常,因爲你不能在一個枚舉刪除項目。 ReSharper是否抓住這樣的事情?

回答

0

VS 2010上的Resharper 6.1並沒有將它趕出盒子。 Resharper認爲它不是Skeet-code tho,因爲它暗示轉換爲linq。

0

ReSharper的任何版本都沒有發現此問題。要創建可以警告這種情況的自定義模式並不容易,因爲您的迭代代碼可能非常複雜。

如果你想創建一個自定義模式,我會建議創建一個建議(可能是一個警告)。您的圖案看起來類似的東西:

$ICOLLECTION$.Remove($arg$) 

其中$ ICollection的$是類型了System.Collections.Generic.ICollection的表達和$ ARG $是參數的佔位符。

這樣你總會有一個建議(或警告)。

我知道問題只是關於ReSharper,但我想顯示解決方法來完成我的答案。此問題的解決方法是使用RemoveAll。下面是在C#中的例子:

datVehicles.RemoveAll(x => x.Id == -1); 
+0

'RemoveAll'是'名單的方法',而不是'IEnumerable的' –

+0

@JohnSaunders你是正確的,但它很容易,因爲它需要的IEnumerable 參數爲創建列表構造函數。 – Vadim

+0

是的。如果您可以接受處理原始序列的副本。 –

相關問題