热门文章 | 热门软件| 热门源码 | 热门电影 | 知识库 | 联系我们
软件 源码 教程 影视 健康 招聘
  HTML | JavaScript | ASP | PHP | JSP | NET | VB | VC | VF | Windows | Linux | Mysql | Mssql | Oracle | Struts 
当前位置: 创世纪计算机资源网 -> 文章频道 ->java 
站内搜索:
遍历ArrayList易犯错误
作者:风前絮 来源:bbs 整理日期:2007-10-30
遍历ArrayList易犯错误 场景:

将ArrayList中符合条件的记录删掉,第一时间写出的程序如下:

            foreach (string aStr in  aList)
            {
                if (aStr.Equals(textBox1.Text))
                {
                    aList.Remove(aStr);
                }
            }
似乎没有错误,编译也通过的,但运行时如果真的遇到符合条件的数据,则会抛出错误:


简单的解决办法是如何呢?这时用Clone方法最好不过了,用如下代码:

            ArrayList bList = (ArrayList)aList.Clone();
            foreach (string aStr in  bList)
            {
                if (aStr.Equals(textBox1.Text))
                {
                    aList.Remove(aStr);
                }
            }

似乎集合类型都会有这样的问题的。

posted on 2004-09-08 13:53 风前絮~~ 阅读(1047) 评论(25)  编辑 收藏 

评论
# re: 遍历ArrayList易犯错误    
用for就可以避免这样的问题,而且for的执行效率还高过foreach 
2004-09-08 14:10 | 什么都不知道 
# re: 遍历ArrayList易犯错误    
啊,你.....你居然...居然敢用foreach来reomove,这是臭名昭著的Collection问题..... 
2004-09-08 14:24 | 寒枫天伤 
# re: 遍历ArrayList易犯错误    
一般是用 
foreach(object item in al.ToArray()) 
.. 
或者是 in new ArrayList(somecollection). 

2004-09-08 14:55 | Lostinet 
# re: 遍历ArrayList易犯错误    
好象是有一个浅表拷贝的方法。 
最好是用哪个,不要用Clone 
2004-09-08 15:11 | hyifeng 
# re: 遍历ArrayList易犯错误    
用for语句反向遍历即可 
2004-09-08 16:07 | feilng 
# re: 遍历ArrayList易犯错误    
也犯过这样的错误,呵呵 
2004-09-08 16:10 | cure 
# re: 遍历ArrayList易犯错误    
To 什么都不知道:
for的方法也可以啊,代码如下?
            for (int i=0;i<aList.Count;i++)
                if (aList[i].Equals(textBox1.Text))
                    aList.RemoveAt(i);

To Lostinet :
你的方法也不错啊

To hyifeng:
对于ArrayList,Clone已经是一个浅表副本了。你说的是MemberwiseClone吗?

看来这种处理已经有三种方法了,foreach里面用Clone,for循环,ToArray,不知道那种比较好呢?
如何可以获得比较的数据?

2004-09-08 16:12 | 风前絮~~ 
# re: 遍历ArrayList易犯错误    
To feilng: 

反向遍历?有什么好处啊?大致如何实现呢? 
2004-09-08 16:18 | 风前絮~~ 
# re: 遍历ArrayList易犯错误    
也有过,for应该是最安全的,而且简单易懂 

Clone和ToArray至少增加了处理量 
2004-09-08 16:23 | dali 
# re: 遍历ArrayList易犯错误    
To 风前絮~~ : 
对于for的代码,应该增加一个条件分支,调用了RemoveAt方法的话,index不能够增加。也就是说循环递增语句不应该写在for的括号里面。 
2004-09-08 17:56 | FantasySoft 
# re: 遍历ArrayList易犯错误    
受不了你们了,竟然。。。。竟然这种低级的错误都犯!!!!一个还不要紧,竟然是一群!!!晕~

删除的代码如下:


for (int i=aList.Count; --i >=0;)
    if (aList[i].Equals(textBox1.Text))
        aList.RemoveAt(i);
2004-09-08 18:54 | 老翅 
# re: 遍历ArrayList易犯错误    
呵呵~ 
2004-09-08 19:20 | hBifTs 
# re: 遍历ArrayList易犯错误    
To 老翅: 

哈哈~~ 
相关文章