我有这个代码必须删除包含大于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循环遍历所有元素。有没有一种简单的方法来解决这个问题?
答案 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])
}