2

我有这个代码必须删除从 1 到 700 的所有数字,其中包含大于 6 的数字

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sevenland_Numbers
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> numbers = new List<string>();

            for (int i = 0; i <= 700; i++)
            {
                numbers.Add(i.ToString());

            }

            for (int i = 0; i <numbers.Count; i++)
            {
                if (numbers[i].Contains('7') || numbers[i].Contains('8') || numbers[i].Contains('9'))
                {
                    numbers.Remove(numbers[i]);
;
                }

            }
            for (int i = 0; i < numbers.Count; i++)
            {
                Console.WriteLine(numbers[i]);
            }


        }
    }
}

但是当我使用 Remove 时,列表会调整大小,因此我不会使用 for 循环遍历所有元素。有没有简单的方法来解决这个问题?

4

4 回答 4

5

这是一个简单的方法:

var toRemove = "789";
numbers.RemoveAll(n => toRemove.Any(r => n.Contains(r)));
于 2013-11-07T20:36:12.247 回答
4

打电话后只需减少计数器Remove

for (int i = 0; i <numbers.Count; i++)
{
    if (numbers[i].Contains('7') || numbers[i].Contains('8') || numbers[i].Contains('9'))
    {
        numbers.Remove(numbers[i]);
        i--;
    }
}

这将导致您的循环使用相同的值重复操作,并使其不会“跳过”列表中的下一个值。

当然,您也可以随时使用 LINQ:

var numbers = new List<string>();
for (var i = 0; i <= 700; i++)
    numbers.Add(i.ToString());

numbers = numbers
             .Where(n => !(n.Contains('7') || n.Contains('8') || n.Contains('9')))
             .ToList();

for (var i = 0; i < numbers.Count; i++)
    Console.WriteLine(numbers[i]);
于 2013-11-07T20:21:36.863 回答
2

有。

每当你删除一个元素时,递减迭代器索引,如下所示:

 for (int i = 0; i <numbers.Count; i++)
 {
   if (numbers[i].Contains('7') || numbers[i].Contains('8') || numbers[i].Contains('9'))
   {
      numbers.Remove(numbers[i]);
      i--;
   }
 }

或者,您可以向后浏览列表(递减到 0):

 for (int i = numbers.Count-1; i >= 0; --)
 {
   if (numbers[i].Contains('7') || numbers[i].Contains('8') || numbers[i].Contains('9'))
   {
      numbers.Remove(numbers[i]);
   }
 }

这样,数学就会自行解决。

于 2013-11-07T20:22:22.997 回答
0

通常我会使用删除循环:

for(int i = numbers.Count - 1; i > -1; --i){
    numbers.Remove(numbers[i])
}
于 2013-11-07T20:24:58.710 回答