2012-10-17 18 views
1

即使在RemoveAt()方法,我的名單一直是相同的,我甚至不得到一個錯誤:RemoveAt移除()不工作C#

foreach (var row in queryCandidates.ToList()) 
{ 
    try 
    { 
     xString = queryCandidates.ToList().ElementAt(i).District; 
     int.TryParse(xString, out xNumber); 

     temp = xNumber.Equals(districtNumber); 
     System.Diagnostics.Debug.Write(temp+ " "); 
     System.Diagnostics.Debug.Write(i+" "); 
     if (temp == false) 
     { 
      System.Diagnostics.Debug.WriteLine(" i is:"+i); 

      //not working even when it should 
      queryCandidates.ToList().RemoveAt(i); 

     } 
    } 

    catch { } 
    i++; 
    if (last == i) 
    { 
     System.Diagnostics.Debug.WriteLine("before ending loop: "); 
     return View(queryCandidates.ToList()); 
    } 
} 

System.Diagnostics.Debug.WriteLine("after ending the loop: "); 
return View(queryCandidates.ToList()); 
+8

這裏有很多'ToList()'。 – Arran

+1

每次創建一個新列表('queryCandidates.ToList()。RemoveAt(i);'),從它中刪除一個項目並丟棄列表 –

+1

空的catch {}'只會隱藏錯誤。最好刪除它。 –

回答

5

ToList()創建一個新的實例。從這個實例中刪除元素。您是而不是從原始可枚舉中移除該元素。

你應該做這樣的事情,而不是:

var candidates = queryCandidates.ToList(); 
var elementsToRemove = new List<int>(); 
foreach (var row in candidates) 
{ 
    // ... 
    xString = candidates[i].District; 
    // ... 
    if (temp == false) 
    {    
     // ... 
     elementsToRemove.Add(i); 
    } 
} 

for(int i = elementsToRemove.Count - 1; i >= 0; --i) 
    candidates.RemoveAt(elementsToRemove[i]); 

return View(candidates); 

請注意使用elementsToRemove。您無法直接在循環中刪除項目。這會引發異常。


此外,請注意ToList複製所有數據。每次你打電話給它。很明顯,這在循環中不是一個好主意。

+0

另一個問題是他/她試圖在foreach循環中修改集合。這不起作用。 –

+0

@downvoter:請留下評論,以便我可以改進答案。 –

+0

感謝它的工作現在 –

0

queryCandidates不是一個列表。

您正在將其轉換爲列表,該列表將創建一個新的實例,您將從中刪除該項目,但不會影響queryCandidates本身。

你可以這樣做:

var queryCandidates myCollection.ToList();

然後

queryCandidates.RemoveAt(i);

3
queryCandidates.ToList().RemoveAt(i); 

ToList()創建了一個全新的列表,然後您可以刪除一個元素,但名單早已不復存在。

嘗試:

var newList = queryCandidates.ToList(); 

for (int i=newList.Count-1; i>=0; i--){ 
///snip 
newList.RemoveAt(i); 

請注意,我改變了你的foreach爲(反向),因爲當你迭代它用foreach你不能修改的列表。

+0

不錯,這工作謝謝 –

1

嗯,我不完全確定類型queryCandidates是什麼,但你沒有看到更新的原因是因爲你是從錯誤的對象中刪除元素'我'。您的ToList()函數創建一個List類型的新對象。如果您想保留更改,則需要緩存該列表並在使用原始queryCandidates對象的地方使用它。

+0

好的,謝謝你的快速答案,也讓我注意到爲什麼它沒有被保存結果 –

+0

沒問題,但請注意,如果你的C#可以很生氣嘗試修改您正在迭代的列表。所以你可能不得不改變你的foreach循環爲一個while循環(檢查我是否是),並且如果你保留元素,或者緩存要移除的元素的索引,並且只在「i」循環。 –

3

ToList()函數每次調用它時都會創建一個新的List。該對象將從該列表中刪除,而不是從原始列表中刪除。所以你應該在foreach之前調用ToList一次。

一旦你完成了這個工作,removeAt()調用將會起作用並引發新的問題,因爲你正在嘗試從foreach循環中修改列表。因此,您需要以一種將刪除循環刪除的方式重寫您的代碼。

0

我什麼工作是從下往上刪除:

for (int i = list.Count - 1; i > 0; i--) 
{ 
    if (list[i][0] == "&nbsp;" || list[i][3] == "0") 
     list.RemoveAt(i); 
} 

這是有道理的,有些項目會減少項目計數後錯過。