c#使用list时如何浏览列表中的每个项目。移除

时间:2013-11-07 20:19:05

标签: c#

我有这个代码必须删除包含大于6的数字的1到700之间的所有数字

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 个答案:

答案 0 :(得分:5)

这是一种简单的方法:

var toRemove = "789";
numbers.RemoveAll(n => toRemove.Any(r => n.Contains(r)));

答案 1 :(得分: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]);

答案 2 :(得分: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]);
   }
 }

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

答案 3 :(得分:0)

通常我会使用删除循环:

for(int i = numbers.Count - 1; i > -1; --i){
    numbers.Remove(numbers[i])
}