[ERROR]Collection was modified; enumeration operation may not execute.

在刪除List物件裡面的項目時,如果用foreach去刪除,就會出現 Collection was modified; enumeration operation may not execute. 的錯誤訊息。所以那裡如何刪除呢?

在刪除List物件裡面的項目時,如果用foreach去刪除,就會出現如下的錯誤訊息,

System.InvalidOperationException was unhandled
  _HResult=-2146233079
  _message=Collection was modified; enumeration operation may not execute.
  HResult=-2146233079
  IsTransient=false
  Message=Collection was modified; enumeration operation may not execute.

 

這是因為List的內容在foreach之中,有些項目被刪除了,而發生錯誤!

var list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//會有Collection was modified; enumeration operation may not execute.錯誤
foreach (int item in list)
{
	if (item % 2 == 0)
		list.Remove(item);
}

image

 

所以這時,可以使用常常使用的for...loop由大到小的方式來刪除這些項目,如下,

var list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//way 1: for loop 從大到小
for (int i = list.Count() - 1; i >= 0; i--)
{
	if (list[i] % 2 == 0)
		list.RemoveAt(i);
}
//列出被刪除後的結果
foreach (int item in list)
{
	Console.WriteLine(item.ToString());
}

 

或是使用 RemoveAll ,如下,

var list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//way 2: RemoveAll + Predicate
list.RemoveAll(x => x % 2 == 0);
//列出被刪除後的結果
foreach (int item in list)
{
	Console.WriteLine(item.ToString());
}

image

 

當然,如果用另外一個List物件去記錄之後,再刪除也是可以的哦!

 

參考資料

.NET Puzzles, Gotchas & Cautionary Tales

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^