列表扩展方法的Microsoft.Maintainability错误

时间:2011-09-29 23:22:51

标签: c# list .net-3.5 extension-methods windows-ce

所以我尝试为List创建一些基本的扩展方法。基本上我有一个UniqueAdd和UniqueAddRange。它会在添加之前检查是否存在值,如果它已经在List中,则不会添加它。这是代码:

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。

2 个答案:

答案 0 :(得分:4)

我认为您的代码在FxCop中触发了一个错误,“Collection was modified”是一个经典的oops。然后它决定它的bug是你的问题,catch(异常)风格。

寻找更新。我使用的那个并没有抱怨你的代码(VS2010版本)。

答案 1 :(得分:1)

它告诉您在更新列表时会对其进行枚举。从您的代码中可以清楚地看到(您在枚举的同时添加到列表中)。

怎么样:

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

或者,如果界面适合您的需要,请使用Hashset。它可以开箱即用。