打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
集合已修改;可能无法执行枚举操作 for 与foreach

今天弄dictionary遍历缓存集合,定时清除10分钟以上的缓存项,部分代码如下

 foreach (var item in CACHE_POOL)
            {
                TimeSpan ts = DateTime.Now - item.Value.LastTime; 
                if (ts.TotalMilliseconds > cleartime * 60000)
                    CACHE_POOL.Remove(item.Key);
            }

 

测试时候发现出现“  集合已修改 ; 可能无法执行枚举操作 ”的问题

查阅了一下发现for和foreach的一个算是蛮重要的区别

foreach是取只读的,在取的时候数据不 能变(包括修改,删除,添加等),因为在取之前foreach的集合已经定好了,

我们一旦执行增删改,相当于一边遍历一边往里加东西,遍历不明白了。

要避免这个问题,可以使用for循环去完成此功能,或者先copy要foreach的对象,对copy的对象进行遍历,然后remove对象本身,不过copy的方法有时候并不太好用,最好还是用for解决。

我做的是符合条件的remove,for时,i++,所以当移除某项后,下一项补上来了,因此要在符合条件的时候再来个i--,使得remove后,for循环继续执行补上来的下一项

修改后的代码

 for(int i=0;i<CACHE_POOL.Count;i++)  
            {
                TimeSpan ts = DateTime.Now - CACHE_POOL.Values.ElementAt(i).LastTime;
                if (ts.TotalMilliseconds > cleartime * 60000)
                {
                    CACHE_POOL.Remove(CACHE_POOL.Keys.ElementAt(i)); 
                    i--;
                }
            }

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
memcached基本操作
C# 异常处理:集合已修改;可能无法执行枚举操作
【Unity3D 问题总结】Unity报错提示:InvalidOperationException: Collection was modified; enumeration operation ma
ecshop模板循环foreach的使用方法及参数详解
Dictionary遍历
遍历Newtonsoft.Json.Linq.JObject
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服