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

本文关键字:删除 实体 集合 foreach 使用 | 更新日期: 2023-09-27 18:18:09

当尝试运行此代码时,我一直得到"collection was modified"错误

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;

我不知道该怎么做。我相信这是一个普遍的问题,但我似乎找不到任何解决办法。

任何帮助,甚至链接到一个已回答的问题将不胜感激。

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

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

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

复制要删除的项目列表:

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

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

您是否试图做其他事情而不是从mat.Courses中删除所有课程?你的代码有点复杂,让我怀疑你可能对变量的引用是如何工作的感到困惑。

当您执行var oldCourses = mat.Courses时,oldCoursesmat.Courses指向相同的引用。因此,当您遍历mat.Courses并从oldCourses中删除时,您正在修改foreach循环使用的迭代器。这就是你得到错误的原因。

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

如果你只想删除一些项目,你必须使用另一个列表与你想要删除的课程,迭代它并执行mat.Courses.Remove(oldCourse)