关于上个在foreach中ArrayList.Remove出错的解释

C# List Remove 注意事项 项目的GitHub地址   以下代码应该输出什么呢?using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace TestCollectionDelete { class Program { 阅读详情
关于上一篇中在foreach中Remove某一ArrayList的tiem会出错的问题,在网上搜了一下,发现这居然是一个臭名昭著的Collection问题,许多人第一次这样做的时候都中招了,现在将问题出现的原因及解决方法记录一下,确保以后不要再犯这种错误。

首先是foreach:
MSDN中的说明:foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但 不应用于更改集合内容以避免产生不可预知的副作用。

其次是ArrayList.Remove:
当你remove第i个item时,第[i + 1, count)域中所有items的索引值皆减一(Array是连续的,要满足只要有k ∈ [0, count)则Array[k]必存在),那么当你在循环下一轮用i + 1为索引访问的即是原先list中索引为i + 2的那个item,由此可知,假设0号被删除时,原1号变为新0号,原2号变为新1号。。。下一轮访问的1号就是先前的2号,而原始的1号则永远没有被访问到 。

由上面的总结可以看出,这里出现 InvalidOperationException异常的原因应该是在foreach中更改了Collection集合内容的缘故,而不是我想象中的ArrayList发生了断链,尽管在foreach循环中会少访问一个item。

问题的解决方法有好多种,除了上一篇中我的解决方法外,还可以在foreach里面用Clone,for循环,ToArray……等等多种方法。
这里我选择用反向for循环方法来解决,因为这是几种方法中最高效的。修改上篇的代码为:
         public   void  DeleteOneUser( string  userSIPURI)
        
{
            
for (int i = userArray.Count; --i >= 0; )
            
{
                
if (((PoCContactItem)userArray[i]).GetUserSipUri() == userSIPURI)
                
{
                    userArray.RemoveAt(i);
                }

            }

            RefeshSesonTreVw();
        }
程序运行正常。
反向for循环的方法非常简洁,推荐。


以上内容部分来自 http://blog.youkuaiyun.com/i_like_cpp/archive/2005/01/30/273843.aspx  
10万元AI智能体落地实战:SaaS、RPA+Agent与开源自研三路径对比 AI智能体是企业实现业务自动化的重要技术形态,其核心在于将大模型能力与具体任务流程深度结合。原理上,它依赖于任务编排、工具调用与决策闭环三大机制,技术价值体现在降低人力重复操作、提升响应实时性与增强规则执行刚性。典型应用场景包括结构化数据处理(如运单解析)、跨系统流程协同(如HR入职自动化)及非结构化信息理解(如会议纪要生成)。在预算受限的现实条件下,SaaS方案以开箱即用和低运维成本见长,RPA+Agent组合兼顾灵活性与可控性,而开源自研则适用于强定制与高集成需求。本文聚焦10万元级真实项目约束,结合S 阅读详情

相关推荐

Allegro模块复用:从原理图到PCB的完整流程与关键细节

本文详细介绍了Allegro模块复用从原理图到PCB的完整流程与关键细节,包括DSN和MDD文件的创建、模块调用的实战技巧以及双向同步与版本控制方法。通过标准化处理和高级复用技巧,能显著提升PCB设计效率,减少重复工作时间。适用于智能硬件和工业控制等领域的工程师。

weixin_30252709的博客 332

foreach中remove/add报错问题?!

- 问题引入 public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("kobe"); list.add("james"); list.add("curry"); for (String s : list) { if (s.e...

weixin_43872459的博客 803

避坑指南:Unity与Visual Studio开发环境配置中的5个常见问题及解决方案

本文针对Unity与Visual Studio开发环境配置中的5个常见问题,提供了详细的解决方案。重点解决了项目文件生成失败导致命名空间无法识别、调试器无法附加、包管理器与扩展安装混乱、脚本编译错误以及多版本环境冲突等核心痛点,帮助开发者构建稳定高效的开发调试环境。

weixin_27791839的博客 281

java使用for each或迭代器遍历容器(如List)并执行remove操作时出现错误

java中遍历删除最保险使用迭代器的remove方法,本文删除部分不使用时的错误。

Mechanic_PK的博客 1840

Shopee 虾皮API接口:商品详情采集的实践

随着电商行业的蓬勃发展,数据采集和分析在商业决策中扮演着越来越重要的角色。Shopee作为东南亚领先的电商平台,拥有大量的商品数据。通过Shopee的API接口,我们可以方便地获取商品详情,为数据分析和市场研究提供有力支持。本文将介绍如何使用Shopee API接口采集商品详情,并分享一些实践技巧。提供了丰富的数据接口,包括商品详情、店铺信息、订单数据等。通过API接口,开发者可以轻松地获取Shopee平台上的数据,进行进一步的处理和分析。Shopee API接口:商品详情采集的实践与技巧。

An4480的博客 1888

c语言版数据结构课程设计 学生成绩管理系统

此学生成绩管理系统完成15项功能,是我经过很多次的修改得到的。花费时间不短,功能齐全,主要完成了:输入,输出,插入,修改,删除,查询,读取文件,写入文件,复制文件,建立索引,显示各种情况下的信息,追加学生信息等等功能。一共15项。   代码如下: // shujujiegou.cpp : 定义控制台应用程序的入口点。///**本程序采用数组链表形式,原因:数组查询速度快,数组也能实现动态存储

Java 1万+

foreach中使用remove问题

先贴代码:     List a = new ArrayList();         a.add("1");         a.add("2");         for (String temp : a) {             if ("2".equals(temp)) {                 a.remove(temp);             }   

ch的博客 6556

YOLOv8【第十章:多任务扩展深度篇·第19节】YOLOv8 与 DeepLabV3+ 对比——实时性与精度的权衡!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 1万+

是否可以修改数据库超限额警告消息的发件人

是否可以修改数据库超限额警告消息的发件人 环境 产品:Lotus Domino Server平台:无关版本:6.x

点点滴滴 1216

复现CVE-2014-085(Apache ZooKeeper 未授权访问漏洞)

默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据。

记录并分享学习安全的知识点.. 2177

用一组可复现实验讲清 ABAP 内表 Standard / Sorted / Hashed 的性能差异

摘要(150字): SAP项目中性能问题常源于ABAP内表选型不当。标准表(STANDARD TABLE)写入快但查找慢(线性扫描),适合遍历场景;排序表(SORTED TABLE)保持有序,支持二分查找,适合范围查询;哈希表(HASHED TABLE)基于唯一键实现常数级查找,适合高频精确匹配。实验表明:标准表+BINARY SEARCH需预排序,成本可能高于直接使用排序表;哈希表在键匹配时性能最优。Gateway和RAP场景中,内表选型直接影响接口响应,建议根据读写负载(追加/遍历/精确查找)选择对应类

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 203

ArrayList在foreach循环的时候remove元素报错

jdk基于fast-fail机制,当集合内部结构发生预期外变化时抛出ConcurrentModificationException

极客中年的博客 746

华为OD机试真题-查找单入口空闲区域(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【查找单入口空闲区域】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 查找单入口空闲区域。

qq_45776114的博客 1269

foreach循环遍历List,删除其中某元素报错问题

1. foreach循环遍历List集合,并删除其中的"lisi" public class TestListDel { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("zhangsan"); list.add("simon")...

stormkai的专栏 3870

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

集合foreach/Iterator遍历中途remove报错

分析源码

xyjy11的博客 862

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java关于foreach循环remove/add元素报错得解决

其实报错得原因就是抛出异常,违背了fail-fast 保护机制 此时我们换做迭代器来实现循环 List<String> list=new ArrayList<>(); list.add("1"); list.add("2"); Iterator<String> iterator=list.iterator(); while(iterator.hasNext()){ String item=iterator.next(); if(删除元素得条件){

qq_41144042的博客 893

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ArrayList 和 List 集合类型

ArrayList 或 List 对象是较为复杂的数组。ArrayList 类和 List 泛型类提供多数 System.Collections 类都提供的但 Array 类未提供的一些功能。例如: Array 的容量是固定的,而 ArrayList 或 List 的容量可根据需要自动扩充。如果更改了 Capacity 属性的值,则可以自动进行内存重新分配和元素复制。 ArrayLis

绝凌峰 506

《假如正在面试》集合篇: 为什么foreach remove 会报错?

个人理解 modCount:记录了该集合在使用过程中被修改的次数。 expectedModCount:指的是预期的修改次数。 如果这两个不相等,抛出并发修改异常 后话 今年我从福州跳槽到了杭州,准备面试的过程中,最痛苦的事情莫过于八股文太枯燥,非常容易忘记,面试过程中明明感觉问题有印象,但是又讲不明白。 在我面试的过程中,整理了不少面经,索性将每个知识点拆分成问答的形式,自问自答。平时只需要经常看看错题,可以节省不少的时间,如果你也考虑换工作,不妨尝试一下这个方法。 面试题和答

Tomxin7 256

C# Foreach Dictionary.Remove() 报错:集合已修改;可能无法执行枚举操作

C#在对集合进行值修改或者Remove(key)的时候不能使用Foreach,否则Count和索引会在循环的时候更改,可以使用for循环遍历。 int[] keyArray = userSockets.Keys.ToArray<int>(); for (int i = 0; i < keyArray.Length; i++) { if (socket == userSockets[keyArray[i]]) { userSockets.Remove(ke

AdamShyly的博客 1726

foreach遍历list删除元素一定会报错?

list集合平常自以为用的非常熟了,原来只是用add()方法熟练而已,碰到remove一报错就彻底暴露了自己的短板啦。 来,给list集合删除某些元素,先上一段代码:       1)报错啦      List list = new ArrayList(); list.add("1"); list.add("2"); list.add("3")

2万+

ArrayList在for循环中使用remove方法移除元素

有时候我们需要在一个ArrayList的for循环中动态删除元素的需求, 废话不多说看代码 List list = new ArrayList(); list.add(0); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); //正常循环 for (int i =

LeBlock的博客 2万+

foreach循环的时候remove的问题

在foreach循环期间remove了其中一个元素,然后就报错了: Exception in thread "main" java.util.ConcurrentModificationException 用Iterator循环的时候会出现类似的问题。 问题疑似出现在next()方法上,具体原因我没有研究。 如果真的要在循环期间remove元素,需要使用for(int i=0;i

lkforce 3552
上一篇: 关于ArrayList
下一篇: 关于两个对象的比较
wangleon
博客等级 码龄20年 0粉丝 5原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值