2011-09-29 5 views
3

그래서 List에 대한 몇 가지 기본 확장 메서드를 만들려고했습니다. 기본적으로 UniqueAdd 및 UniqueAddRange가 있습니다. 추가하기 전에 값의 존재 여부를 확인하고 목록에 이미 값이 추가되어 있는지 확인합니다. 여기에 코드입니다 :List 확장 메서드로 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을하지만 난이 정보 주어진 내 확장 메서드를 해결하는 방법을 잘 모르겠어요 . 그것은 말합니다

결합 유형의 수를 줄이기 위해 유형이나 방법을 재 설계하십시오.

이 오류가 발생하는 이유는 누구이며 왜이 규칙을 위반하지 않도록 내 확장 프로그램을 수정하는 방법을 알고 있습니까?

감사합니다.

추신 : 누구나 언급하기 전에 HashSet 사용을 고려했지만 Compact Framework에는 HashSet이 없습니다.

답변

4

나는 당신의 코드가 FxCop에서 버그를 일으켰다 고 생각합니다. "콜렉션이 수정되었습니다"는 고전적인 오류입니다. 그런 다음 그 버그가 당신의 문제, catch (Exception) 스타일이라고 결정했습니다.

업데이트를 찾으십시오. 내가 사용하는 코드는 귀하의 코드 (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에 관해서는 필자의 글에서 Compact Framework에 존재하지 않는다고 언급했다. –

+0

아니요, 'UniqueAddRange'의 foreach 루프가 발 밑에서 변경되는 열거 형을 반복하므로이 문제가 발생합니다. Hashset 일을 발견했기 때문에 취소 선;) LINQ 방법은 모든 삽입을 위해 전체 목록을 조각내어 쓸 필요가 없기 때문에 빠르다. – spender

+0

나는 그것이 정확하다고 생각하지 않는다 :'values'와'list'는 완전히 별개의 두리스트이고'values'를 반복 할 뿐이며 결코 수정하지 않습니다. 나는'list' 만 수정합니다. –

관련 문제