• froeach迭代删除和List迭代删除问题


    场景:我有一个  List records 数据,需要从里面删除指定内容数据

    第一次写成 

    1. foreach(var item in records)
    2. {
    3. if (item.logMessage.Contains("上传通行记录"))
    4. records.Remove(item);
    5. }

    直接报错,因为foreach 是个迭代器 直接移除它的对象会报错

    第二次换成 for

    1. for (int i = 0; i < records.Count; i++)
    2. {
    3. ISSLogMessage item = records[i];
    4. item.moduleName = $"{_gateSentryManager.GateSentryInfo.Name}";
    5. if (item.logMessage.Contains("上传通行记录"))
    6. records.Remove(item);
    7. }

    不报错了,可以跑了,但是有BUG ???

    如果 需要移除的数据是相邻的,那么后面的元素将不会移除

    出现问题:未能删除相邻元素后一个

    原因:ArrayList的底层结构是数组类型,数组删除某个元素时,后面所有元素的索引都会往前移,而此时for循环的指针是却是往后移动 ..........................

    第三次

    1. List<int> rids = new List<int>();
    2. for (int i = 0; i < records.Count; i++)
    3. {
    4. ISSLogMessage item = records[i];
    5. item.moduleName = $"{_gateSentryManager.GateSentryInfo.Name}";
    6. if (item.logMessage.Contains("上传通行记录"))
    7. rids.Add(i);
    8. }
    9. foreach (int i in rids)
    10. {
    11. records.RemoveAt(i);
    12. }

    还是有问题 ....................

    本着觉得写得有点复杂得想法查了下网络  可以写成

    1. IEnumerator rator = records.GetEnumerator();//1.迭代器对象
    2. List m_storageList = new List(); //存储列表
    3. while (rator.MoveNext()) //2.循环条件
    4. {
    5. ISSLogMessage item = (ISSLogMessage)rator.Current;//3.当前值
    6. item.moduleName = $"{_gateSentryManager.GateSentryInfo.Name}";
    7. if (!item.logMessage.Contains("上传通行记录"))
    8. m_storageList.Add(item);
    9. }
    10. records = m_storageList;

    还是新添加靠谱啊 

  • 相关阅读:
    PG::SunsetDecoy
    利用cmake工具生成VisualStudio工程文件
    SpringBoot 如何使用 Spring Data MongoDB 访问 MongoDB
    重学SpringBoot3-内容协商机制
    16哈希表-基础操作
    使用pip3离线安装openpyxl
    卡塔尔世界杯︱足球游戏的打开方式
    洛谷P8395 Good Fours and Good Fives
    抖音如何推广引流?抖音推广引流的经验与工具分享
    【矩阵论】4. 矩阵运算——广义逆——广义逆的计算
  • 原文地址:https://blog.csdn.net/po123op123/article/details/133776123