所以我尝试为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。
答案 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。它可以开箱即用。