本帖最后由 xt654005440 于 2013-8-14 00:35 编辑
看完楼主的代码,基本理解楼主想要通过for循环逐一删除集合str中的所有元素,但是使用str.RemoveAt(i)和str.RemoveRange(0, 1)没有达到预期效果。
首先,我们从集合的定义出发。相对于数组数据类型而言,集合数据类型类似一种高级的动态数组;数组的容量是固定的,而集合可以根据需要自动的扩充或者缩减。
运行楼主的代码,其结果:
这里我们发现删除不完全,那么我们再返回代码,对for循环处进行验算,其逻辑如下:
原集合成员排列:12 33 09 87 99
第一次操作: i=0,删除索引位为0元素后成员排列,33 09 87 99 ,i自增 i=1;
第二次操作: i=1,删除索引位为1元素后成员排列,33 87 99 ,i自增 i=2;
第三次操作: i=2,删除索引位为1元素后成员排列,33 87 ,i自增 i=3;
当i=3时,集合中元素的个数仅为2,根据( i < str.Count )==flase的判断,则跳出for进入if序列,得出上图所示结果。
症结所在:集合删除某引索位元素后,其数据长度已发生改变,则各元素引索位置亦发生变化。
既然语法无恙,那么可以改进算法纠正逻辑错误,受“双向冒泡排序”启发,原代码只完成了前一半工作,那么我们再由后向前检索一次可以完成全部删除工作,改进后主要代码:
Console.WriteLine("该集合中一共有{0}个元素", str.Count);
int low, up; //定义2个索引位,low为低位,up位高位
for (low = 0; low < str.Count; low++) //由低位开始检索集合str
{
str.RemoveAt(low); //移除指定索引处的元素
//str.Remove(09);//移除特定对象的第一匹配项
//str.RemoveRange(0, 1);//移除一定范围的元素 Reverse(int index, int count);index起始索引 count个数
}
Console.WriteLine(“集合剩余元素为:” + str.Count); //打印此时集合长度
for (up=str.Count-1; str.Count > 0; up--) //设置up为剩余集合的最末元素的索引,又高位开始删除
{
str.RemoveAt(up); //移除指定索引处的元素
//str.Remove(09);//移除特定对象的第一匹配项
//str.RemoveRange(0, 1);//移除一定范围的元素 Reverse(int index, int count);index起始索引 count个数
}
输出结果:
以上分析与修改希望对你有所帮助~!{:soso_e100:}
|