//从键盘接收一个字符串,将其中的所有数字字符去除后,显示; Console.WriteLine("请输入一组数字"); List<char> list = Console.ReadLine().ToList(); for (int i = 0; i < list.Count; i++) { if (list[i] >= '0' && list[i] <= '9') { list.RemoveAt(i);//?? } } foreach (char c in list) { Console.Write(c); }
问题不是在if判断中,而是出在使用remove方法去除数字字符。
主要原因是:使用List.RemoveAt()方法移除该字符,但是该方法会使后面的字符向前移动,导致部分数字字符被忽略或者重复输出,所以不能直接在循环中移除列表中的元素。
更具体点说:当判断数字字符2时,i=5,使用removeAt(5)后,直接导致list变为ewqrf34r,此时list[5]是3。再次进入循环,i++,i变为6,此时list[6]是4,removeAt(6)后,list变为ewqr3r。该过程中数字字符3前移,从而导致3被忽略。
解决办法:可以定义一个新的字符串result,若判断不是数字,则result+=list[i]。
或者换一个方式实现,如下: