c#迭代删除项目并直接添加到List?

时间:2016-04-04 22:53:19

标签: c# linq list removeall

我在这里搜索了很多关于如何使用.remove和.removeAll扩展名列表的例子。在尝试使这项工作,我似乎无法让.removeAll以我想要的方式实际从List中删除项目。它正在做的是保留List中每个值的一个副本。

循环正在迭代'k'描述的一组值。我想要的是如果List上的'k'值是ALREADY,我想从List中完全删除它。如果遇到不在列表中的'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 
                }   
            }

我还想过创建一个单独的列表,并在第一个'if'语句中添加到该列表,然后比较并以某种方式删除第一个列表中的项目,如下所示:

                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上进行迭代,而无需创建其他列表?

1 个答案:

答案 0 :(得分:0)

不是。使用foreach循环或ascendent for循环迭代时,您无法更改集合,因为在您删除项目后枚举操作将失败。

您可以使用向后for循环删除项目,如下所示:

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

但这里最好的选择可能就是创建一个新列表。