3

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

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;

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

任何帮助甚至是已回答问题的链接都将不胜感激。

4

3 回答 3

19

您可以通过使用简单地枚举此集合以用作迭代器.ToList()

foreach (var oldCourse in mat.Courses.ToList())
{
  oldCourses.Remove(oldCourse);
}
于 2013-06-11T23:13:26.503 回答
4

复制要删除的项目列表:

foreach (var oldCourse in mat.Courses.ToList())
{
    oldCourses.Remove(oldCourse);
}

尽管在这种情况下,我不确定您为什么不直接说mat.Courses.Clear();.

除了删除所有课程之外,您是否还想做其他事情mat.Courses?您的代码有点复杂,让我怀疑您可能对变量引用的工作方式感到困惑..

于 2013-06-11T23:13:57.630 回答
2

当你这样做时var oldCourses = mat.CoursesoldCoursesmat.Courses都指向同一个引用。因此,当您迭代mat.Courses并从中删除时oldCourses,您正在修改foreach循环正在使用的迭代器。这是您遇到错误的原因。

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

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

于 2013-06-11T23:28:43.807 回答