遍历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 老翅:
哈哈~~