Ошибка Microsoft.Maintainability с методами расширения списка - PullRequest
3 голосов
/ 30 сентября 2011

Итак, я попытался создать несколько базовых методов расширения для List.По сути, у меня есть UniqueAdd и UniqueAddRange.Он будет проверять наличие значения перед добавлением и, если оно уже есть в списке, не будет добавлять его.Вот код:

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.

Вот ссылка на ошибку, но я неуверен, как исправить мои методы расширения, учитывая эту информацию.Это говорит

Попробуйте изменить тип или метод, чтобы уменьшить количество типов, с которыми он связан.

Кто-нибудь знает, почему я получаю эту ошибкуи как исправить мои методы расширения, чтобы они не нарушали это правило?

Спасибо!

PS: Прежде чем кто-либо упоминал об этом, я рассмотрел использование HashSet, но HashSet не существует в компактрамки.

Ответы [ 2 ]

4 голосов
/ 30 сентября 2011

Я думаю, что ваш код вызвал ошибку в FxCop, "Коллекция была изменена" - классическая упс.Затем он решил, что его ошибка была вашей проблемой, поймать (исключение) стиль.

Ищите обновление.Тот, который я использую, не жалуется на ваш код (версия VS2010).

1 голос
/ 30 сентября 2011

Он говорит вам, что вы меняете список по мере его перечисления. Это ясно из вашего кода (вы добавляете в список одновременно с перечислением).

Как насчет:

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

Или, если интерфейс подходит для ваших нужд, используйте Hashset. Он делает то, что вы хотите из коробки.

...