2012-10-20 81 views
1

嗨我試圖從arrayList中刪除所有可以被二整除的數字。問題是,一個元素被刪除後,我得到一個InvalidOperationException。InvalidOperationException在刪除arrayList中的元素後

private ArrayList RemoveDivTwo(ArrayList list) { 
     int count = 0; 
     foreach(int i in list){ 
      if ((i > 2) && (i % 2 == 0)) { 
       list.RemoveAt(count); 
      } 
      count++; 
     } 

     return list; 
    } 

我該如何解決這個問題,所以我wont't得到一個異常,並能夠由兩個去除整除的所有元素?

+0

這是一個常見的。請記住,如果您正在使用「foreach」進行迭代,則無法在集合中添加/刪除項目。 –

+0

如果你在想,爲什麼這是一個無效的操作,請閱讀這個http://stackoverflow.com/questions/1124221/modifying-collection-when-using-a-foreach-loop-in-c-sharp –

+0

'ArrayList '不是首選的集合類型,除非您正在使用遺留1.1代碼。改爲使用['列表'](http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx)。使用'List '你的代碼可以被重寫爲'list.RemoveAll(i => i> 2 && i%2 == 0)' –

回答

2

試着用這種方法迭代它。

for(int i = 0; i < list.Count(); i++){ 
    if ((list[i] > 2) && (list[i] % 2 == 0)) { 
       list.RemoveAt(i); 
       i--; //as offsets have shifted by one due to removal 
      } 
} 

您不再遍歷列表。所以這應該工作。

+0

唯一的問題是我使用的是arrayList,而我無法獲得元素扔索引 –

+0

是的,你可以;你只需要將它們轉換回int。如果可能的話,這是使用'List '的另一個原因。 –

1

引發異常是因爲foreach循環在開始迭代項目列表之前調用collectionName.GetEnumerator方法。除非在集合上啓動一個新的foreach循環,否則不會再調用GetEnumerator。該列表不能在foreach循環內修改,它僅適用於列表中的只讀操作。

您可以使用for循環來迭代以及修改列表中的元素。

1

我甚至不打擾刪除元素。只需返回你想要的元素作爲新的列表:

List<int> RemoveDivTwo(List<int> list) { 
    return list.Where(i => i % 2 == 1 || i <= 2).ToList(); 
}