购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP


陷阱01
漏洞百出
——使用for删除集合中元素时的陷阱

1.陷阱产生的场景

for语句在程序开发中经常被用到,它语法简单、逻辑严谨,完全可以替代其他任何循环语法,所以说它的可应用范围最广泛。但在应用for语句时也要注意,该语句内部的局部自增或自减变量i若处理不当,可能给程序带来巨大隐患。比如在使用for语句删除集合中的元素时,就可能出现下面的情况。

例4.1 使用for删除集合元素时的陷阱(光盘位置:光盘\MR\Instance\4\01\UseFor),该实例的代码如下:

本实例的目的是使用for语句删除集合中的所有元素,上述代码中描述了使用RemoveAt方法按照元素的位置索引逐个删除元素,看起来似乎很完美,但运行结果却出人意料,程序运行结果如图4.1所示。

2.陷阱的分析

从执行结果中可以得出这样的判定结论,集合中的元素B在for循环中并未得到执行RemoveAt方法。那么接下来就添加对B元素的快速监视,如图4.2所示,B元素的索引值为1,这足以说明在使用for语句删除集合元素的过程中发生了跳跃,并没有按照元素在集合中的原始顺序逐个删除。

图4.1 使用for删除集合元素时的陷阱

图4.2 “快速监视”窗口

技巧

用鼠标在代码文件中选择要监视的代码,在键盘上按<Shift+F9>组合键,可出现如图4.2所示的“快速监视”窗口。

进一步分析发现,每当删除一个元素时,集合的Count属性值都会减小1,这将直接导致集合中元素的索引重新排序,进一步地说,就是剩余所有元素的索引值都减小1,正如图4.3所示的那样。而for语句的局部变量i仍然在递增,这必将导致删除操作发生跳跃,这就是问题的根源所在。

图4.3 集合元素删除示意图

提示

清除集合中元素的方法有很多,本实例并不是仅仅为了说明如何删除集合的所有元素,而是通过对这种现象的分析,让读者体会在使用循环语句处理集合问题时应该注意什么。

3.陷阱的解决方法

从上面的分析可知,删除集合中的元素会导致剩余元素的索引重排序,但在完全删除元素之前,索引值为0的元素一直存在,这就是解决问题的一个着手点。解决问题的办法可这样考虑,在RemoveAt方法被执行后,就使局部变量i的值减少1,从而始终保持i的值为0,这样每次循环都删除索引值为0的元素,最终实现删除集合中的所有元素。改正后的主要代码如下:

技巧

若要删除List<T>泛型集合中的所有元素,还可使用该泛型集合的Clear方法或RemoveAll方法。其中RemoveAll方法的参数是Predicate<T>类型的谓词委托,用于定义要移除的元素应满足的条件,该方法实现移除与指定的谓词所定义的条件相匹配的所有元素。 x4x5mj2LD22e3Ddgm4NjYNi2fIK6H0n1hEyBxLGwV+bUXgUytdVvBITMmHVQkJts

点击中间区域
呼出菜单
上一章
目录
下一章
×