2016-04-04 17 views
0

我在這裏搜索了很多關於如何使用.remove和.removeAll擴展名列表的例子。在試圖完成這項工作時,我似乎無法讓.removeAll以我想要的方式實際從列表中刪除項目。它正在做的是保留列表中每個值的一個副本。c#迭代刪除和直接添加項目到列表?

循環遍歷由'k'描述的一組值。我想要的是,如果列表中的'k'值已經是ALREADY,我想從列表中完全刪除它。如果遇到不在列表中的'k'值,我想添加它。

  for(double k=Low[0]; k<=High[0]; k +=TickSize) 
      { 
       if(LiTZ.Contains(k)) { //if k is in list 
        LiTZ.RemoveAll(item => item == k); //remove it 
       } 
       else { 
        LiTZ.Add(k); //if k not in list, add it 
       } 
      } 

我也想過創建一個單獨的列表,和「如果」語句添加到列表中,然後再比較,不知何故從第一清單中刪除的項目,像這樣:

   for(double k=Low[0]; k<=High[0]; k +=TickSize) 
       { 
        if(LiTZ.Contains(k)) { //if k is in list 
         LiRemovalList.Add(k); //List of items to remove later 
        } 
        else { 
         LiTZ.Add(k); //if k not in list, add it 
        } 
       } 
       //Code to compare and remove items in LiRemovalList from LiTZ 

是否有可能以我嘗試的方式直接在List上迭代,而無需創建其他列表?

回答

0

不是。您不能在使用foreach循環或forcencen for循環迭代集合時更改集合,因爲在刪除項目後枚舉操作將失敗。這裏

for (int i = LiTZ.Count - 1; i >= 0; i--) { 
    if (LiTZ[i] == something) { 
    LiTZ.RemoveAt(i); 
    } 
} 

但可能是最好的選擇。你會創建一個新的列表:

您可以使用反向for循環,像這樣刪除項目。