我敢肯定,在某些時候我們都這樣寫的一些代碼:當您在枚舉中刪除某個項目時,ReSharper是否會查找?
For Each datVehicle In datVehicles
If datVehicle.ID = -1 Then
datVehicles.Remove(datVehicle)
End If
Next
哪個編譯得很好,但拋出的運行時異常,因爲你不能在一個枚舉刪除項目。 ReSharper是否抓住這樣的事情?
我敢肯定,在某些時候我們都這樣寫的一些代碼:當您在枚舉中刪除某個項目時,ReSharper是否會查找?
For Each datVehicle In datVehicles
If datVehicle.ID = -1 Then
datVehicles.Remove(datVehicle)
End If
Next
哪個編譯得很好,但拋出的運行時異常,因爲你不能在一個枚舉刪除項目。 ReSharper是否抓住這樣的事情?
我不認爲它會自動執行,但是您可以輕鬆創建自定義模式來爲您識別此問題。請參閱:http://blogs.jetbrains.com/dotnet/2010/08/highlighting-custom-patterns-with-resharper/
VS 2010上的Resharper 6.1並沒有將它趕出盒子。 Resharper認爲它不是Skeet-code tho,因爲它暗示轉換爲linq。
ReSharper的任何版本都沒有發現此問題。要創建可以警告這種情況的自定義模式並不容易,因爲您的迭代代碼可能非常複雜。
如果你想創建一個自定義模式,我會建議創建一個建議(可能是一個警告)。您的圖案看起來類似的東西:
$ICOLLECTION$.Remove($arg$)
其中$ ICollection的$是類型了System.Collections.Generic.ICollection的表達和$ ARG $是參數的佔位符。
這樣你總會有一個建議(或警告)。
我知道問題只是關於ReSharper,但我想顯示解決方法來完成我的答案。此問題的解決方法是使用RemoveAll。下面是在C#中的例子:
datVehicles.RemoveAll(x => x.Id == -1);
'RemoveAll'是'名單的方法',而不是'IEnumerable的' –
@JohnSaunders你是正確的,但它很容易,因爲它需要的IEnumerable參數爲創建列表構造函數。 –
Vadim
是的。如果您可以接受處理原始序列的副本。 –