尝试运行此代码时,我一直收到“收集已修改”错误
var mat = db.Materials
.Where(m => m.ID == material)
.First();
var oldCourses = mat.Courses;
foreach (var oldCourse in mat.Courses)
{
oldCourses.Remove(oldCourse);
}
mat.Courses = oldCourses;
我不知道该怎么做。我确信这是一个常见的问题,但我似乎无法找到任何解决方案。
非常感谢任何帮助,甚至是对已回答问题的链接。
答案 0 :(得分:19)
您可以使用.ToList()
简单地枚举此集合以用作迭代器。
foreach (var oldCourse in mat.Courses.ToList())
{
oldCourses.Remove(oldCourse);
}
答案 1 :(得分:4)
制作要删除的项目列表的副本:
foreach (var oldCourse in mat.Courses.ToList())
{
oldCourses.Remove(oldCourse);
}
虽然在这种情况下,我不确定为什么你不只是说mat.Courses.Clear();
。
您是否尝试执行除mat.Courses
之外的所有课程以外的其他操作?你的代码有点复杂,让我怀疑你可能对变量的引用如何工作感到困惑。
答案 2 :(得分:2)
执行var oldCourses = mat.Courses
时,oldCourses
和mat.Courses
指向同一参考。因此,当您遍历mat.Courses
并从oldCourses
中删除时,您正在修改foreach
循环正在使用的迭代器。这就是你得到错误的原因。
在您的代码中,您要删除该集合的所有项目,您可以改为使用mat.Courses.Clear()
。
如果您只想删除某些项目,则必须使用包含要删除的课程的其他列表,对其进行迭代并执行mat.Courses.Remove(oldCourse)
。