【问题标题】:c# iteratively removing and adding items directly to a List?c#迭代地删除项目并将其直接添加到列表中?
【发布时间】:2016-07-24 16:22:23
【问题描述】:

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

循环正在遍历由“k”描述的一组值。我想要的是如果“k”的值已经在列表中,我想将它完全从列表中删除。如果遇到不在列表中的“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

是否可以按照我尝试的方式直接在列表上进行迭代,而无需创建其他列表?

【问题讨论】:

    标签: c# linq list removeall


    【解决方案1】:

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

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

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

    但对您来说,最好的选择可能是创建一个新列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-26
      • 2014-10-28
      • 2021-12-09
      • 1970-01-01
      • 2018-11-29
      • 2020-05-27
      • 1970-01-01
      相关资源
      最近更新 更多