2013-06-11 78 views
3

我不斷收到試圖運行此代碼使用foreach()從集合中刪除多個實體?

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

將ID複製到內存中,並通過這些ID刪除項目;複製整個項目集合的解決方案也可以工作 – OzrenTkalcecKrznaric

回答

15

通過使用.ToList(),您可以簡單地枚舉該集合以用作迭代器。

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

使項目列表的副本刪除:

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

雖然在這種情況下,我不知道爲什麼你不只是說mat.Courses.Clear();

您是否嘗試着從mat.Courses中刪除所有課程?你的代碼有點複雜,並且讓我懷疑你可能對如何引用變量的工作方式感到困惑。

2

當你做var oldCourses = mat.Courses時,oldCoursesmat.Courses指向相同的引用。因此,當您迭代mat.Courses並從oldCourses中刪除時,您正在修改foreach循環正在使用的迭代器。這是你得到錯誤的原因。

在您的代碼中,您正在刪除集合中的所有項目,您可以改爲使用mat.Courses.Clear()

如果你只想刪除一些項目,你必須使用另一個列表和你想刪除的課程,迭代它並且執行mat.Courses.Remove(oldCourse)