【发布时间】:2010-10-13 19:22:27
【问题描述】:
我正在尝试在 .NET 中编写一个扩展方法,该方法将对通用集合进行操作,并从集合中删除符合给定条件的所有项目。
这是我的第一次尝试:
public static void RemoveWhere<T>(this ICollection<T> Coll, Func<T, bool> Criteria){
foreach (T obj in Coll.Where(Criteria))
Coll.Remove(obj);
}
但是,这会引发 InvalidOperationException,“集合已修改;枚举操作可能无法执行”。这确实是有道理的,所以我再次尝试使用第二个集合变量来保存需要删除的项目并对其进行迭代:
public static void RemoveWhere<T>(this ICollection<T> Coll, Func<T, bool> Criteria){
List<T> forRemoval = Coll.Where(Criteria).ToList();
foreach (T obj in forRemoval)
Coll.Remove(obj);
}
这会引发相同的异常;我不确定我是否真的理解为什么“Col”不再是被迭代的集合,那么为什么不能对其进行修改?
如果有人对我如何让它发挥作用有任何建议,或者有更好的方法来实现这一点,那就太好了。
谢谢。
【问题讨论】:
-
你在什么系列上测试这些?由于似乎只有您在第二个上遇到异常,因此您的收藏甚至可能不支持 Remove...
-
这是一个单元测试的摘录,使用此方法时失败,其中“mockStaff”是一个预先存在的列表
。员工 newStaff = 新员工{StaffId = 5};模拟员工。添加(新员工); mockStaff.RemoveWhere(s => s.StaffId == 5); //此处抛出无效操作异常 -
Lee:肯定有别的事情发生。例如,请参阅我的答案。
-
我把方法恢复到以前的样子,现在它似乎像大家说的那样工作了。最离奇的。也许我正在失去它。感谢大家的帮助。
标签: c# .net collections extension-methods