2012-08-13 199 views
2

我試圖使用計數器從列表中刪除某些內容,但它不適用於我。從列表中刪除某些東西

int i =0; 
    foreach(Rolls rl in rolls) 
    { 
     if(rl.getCourseId == courseId && rl.getStudentId == studentId) 
     { 
      rolls.RemoveAt(i) ; 
     } 
     i++; 
    } 

任何人都可以看到爲什麼這可能無法正常工作。它給我一個運行時異常:

「收集已修改;枚舉操作可能無法執行。」

+0

迭代通過循環向後 – user959631 2012-08-13 23:50:21

回答

5

在對其進行透視時,您無法修改集合。嘗試使用常規的for循環,而不是(或while循環):

int i = 0; 
while(i < myCollection.Count) 
{ 
    if(removeItem) 
    myCollection.RemoveAt(i); 
    else 
    ++i; 
} 
+0

這也不行,因爲你刪除項目,指標的變化,你會移除錯誤項目。 – 2012-08-13 23:52:54

+3

不,這就是爲什麼你只增加我,如果你不刪除的東西。 – Jonas 2012-08-13 23:53:44

+0

現在你把例子放在......是的,這會起作用,但很尷尬。 – 2012-08-13 23:56:10

1

,你通過它迭代與foreach您不能修改的集合。

嘗試使用一個for循環,像這樣 for(int i = 0; i < rolls.Length; i++) {

0

foreach所收集不喜歡你的工作。試試這個:

for (int x = 0; x < rolls.Count; x++) 
{ 
    if(rolls[x].getCourseId == courseId && rolls[x].getStudentId == studentId) 
    { 
     rolls.RemoveAt(x); 
     --x; //since we removed an item, the index needs to be updated accordingly 
    } 
} 
+2

這也不是很有效,因爲你的索引會搞砸。刪除後,你需要一個--x。 – Jonas 2012-08-13 23:53:03

+0

+1用於解決我不小心的錯誤。謝謝喬納斯。 – Sam 2012-08-14 00:00:13

+0

你應該反轉循環 – S3ddi9 2012-08-14 00:59:00

0

你應該做一個loopback

for(int i=rolls.Count-1;i>=0;i--) 
    if(rolls[i].getCourseId == courseId && rolls[i].getStudentId == studentId) 
     rolls.RemoveAt(i)