使用foreach()从集合中删除多个实体?

时间:2013-06-11 23:11:00

标签: c# entity-framework collections

尝试运行此代码时,我一直收到“收集已修改”错误

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;

我不知道该怎么做。我确信这是一个常见的问题,但我似乎无法找到任何解决方案。

非常感谢任何帮助,甚至是对已回答问题的链接。

3 个答案:

答案 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时,oldCoursesmat.Courses指向同一参考。因此,当您遍历mat.Courses并从oldCourses中删除时,您正在修改foreach循环正在使用的迭代器。这就是你得到错误的原因。

在您的代码中,您要删除该集合的所有项目,您可以改为使用mat.Courses.Clear()

如果您只想删除某些项目,则必须使用包含要删除的课程的其他列表,对其进行迭代并执行mat.Courses.Remove(oldCourse)