A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 §風過無痕§ 于 2013-8-14 15:34 编辑

如题!请看代码
class Program
{
      static void Main(string[] args)
      {
          List<int> str=new List<int>();
          str.Add (12);
          str.Add (33);
          str.Add (09);
          str.Add (87);
          str.Add (99);
          Console.WriteLine("该集合中一共有{0}个元素",str.Count );
          for (int i = 0; i < str.Count; i++)
          {
               str.RemoveAt(i);//移除指定索引处的元素
               //str.Remove(09);//移除特定对象的第一匹配项
              //str.RemoveRange(0, 1);//移除一定范围的元素 Reverse(int index, int count);index起始索引 count个数
          }
         if (str.Count > 0)
         {
              Console.WriteLine("剩余元素的个数为:" + str.Count + ",具体元素为:");
              foreach (int n in str)
             {
                   Console.WriteLine(n);
             }
           }
          else
          {
                Console.WriteLine("元素全部移除成功!");
          }

          Console.ReadKey();
          }
}

执行下列操作时得不到预期的结果!

str.RemoveAt(i);//移除指定索引处的元素
str.RemoveRange(0, 1);//移除一定范围的元素


求解释!!!!

5 个回复

倒序浏览
本帖最后由 咖喱猫 于 2013-8-13 23:20 编辑

你的移除for循环的循环最大次数不应该用str.Count,当你每一次删除的时候str.Count就会减1,当你删除到集合第三个时i=2;此时集合里面还剩下两个;所以此时str.Count等于2;这个时候当进入下一个循环的时候i=2等于了str.Count=2就会跳出循环。集合里面剩下的两个就没有被删掉。

建议将删除集合的for循环改成while。代码如下:
  1.           while (str.Count>0)
  2.           {
  3.                str.RemoveAt(0);
  4.           }
复制代码
  1.      
复制代码
回复 使用道具 举报
本帖最后由 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:}
回复 使用道具 举报
xt654005440 发表于 2013-8-14 00:31
看完楼主的代码,基本理解楼主想要通过for循环逐一删除集合str中的所有元素,但是使用str.RemoveAt(i)和str ...

意思是每删除集合中的一个元素 (其长度自动更改   索引所在位置也自动更改)????
回复 使用道具 举报
是的,集合是动态存储的数据结构
回复 使用道具 举报
xt654005440 发表于 2013-8-14 09:52
是的,集合是动态存储的数据结构

谢谢指导!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马