2011-09-29 82 views
3

所以我試圖爲List創建一些基本的擴展方法。基本上我有一個UniqueAdd和UniqueAddRange。它將在添加之前檢查值的存在,並且如果它已經在列表中,它將不會添加它。下面是代碼:Microsoft.Maintainability錯誤與列表擴展方法

public static class ListExtensions 
{ 
    /// <summary> 
    /// Adds only the values in the 'values' collection that do not already exist in the list. Uses list.Contains() to determine existence of 
    /// previous values. 
    /// </summary> 
    /// <param name="list"></param> 
    /// <param name="values"></param> 
    public static void UniqueAddRange<T>(this List<T> list, IEnumerable<T> values) 
    { 
     foreach (T value in values) 
     { 
      list.UniqueAdd(value); 
     } 
    } 

    /// <summary> 
    /// Adds the value to the list only if it does not already exist in the list. Uses list.Contains() to determine existence of previos values. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="list"></param> 
    /// <param name="value"></param> 
    public static void UniqueAdd<T>(this List<T> list, T value) 
    { 
     if (!list.Contains(value)) 
     { 
      list.Add(value); 
     } 
    } 
} 

而且我得到以下錯誤,當建築:

CA0001 : Rule=Microsoft.Maintainability#CA1506, Target=Some.Namespace.ListExtensions : Collection was modified; enumeration operation may not execute. 

這裏是link的錯誤,但我不知道如何解決我的擴展方法給出此信息。它對

嘗試重新設計類型或方法以減少它所耦合的類型的數量。

有誰知道爲什麼我得到這個錯誤,以及如何解決我的擴展方法,所以他們不違反這個規則?

謝謝! PS:在任何人提到它之前,我已經考慮過使用HashSet,但HashSet並不存在於緊湊框架中。

回答

4

我覺得你的代碼在FxCop中觸發了一個bug,「Collection was modified」是一個典型的oops。然後,它決定它的錯誤是你的問題,趕上(例外)的風格。

尋找更新。我使用的不是抱怨你的代碼(VS2010版本)。

+0

爲什麼這會降低投票率?這是問題。 –

+0

通常不會意識到心理調試:( –

1

它告訴你,你正在改變列表,因爲你正在枚舉它。這從您的代碼中很清楚(您在枚舉的同時添加到列表中)。

如何:

public static void UniqueAddRange<T>(this List<T> list, IEnumerable<T> values) 
{ 
    list.AddRange(values.Except(list)); 
} 

或者,如果接口是適合您的需求,使用一個HashSet。它做你想要的東西。

+0

謝謝,我會試試看。我忘記了Contains會無意中列舉出這個問題的原因。至於HashSet,我在文章中提到它不存在於緊湊框架中。 –

+0

不,你看到這個問題,因爲'UniqueAddRange'中的foreach循環迭代了一個正在腳下改變的枚舉。發現Hashset的東西,因此刪除線;)LINQ的方式*應該更快,因爲它不需要爲每個插入操作整個列表。 – spender

+0

我不認爲這是正確的:'values'和'list'是兩個完全獨立的列表,我只遍歷'values',我從不修改它。我只修改'list'。 –