在刪除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);
}
所以這時,可以使用常常使用的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());
}
當然,如果用另外一個List物件去記錄之後,再刪除也是可以的哦!
參考資料
.NET Puzzles, Gotchas & Cautionary Tales
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^