你想要在遍历集合(例如List)的同时删除某些元素时,直接在循环中删除元素可能会导致问题,因为这可能会改变集合的大小和导致索引问题;
可以用for循环的倒序来删除;
如果要删除满足特定条件的所有元素,也可以使用List的RemoveAll方法,它接受一个谓词(一个返回布尔值的函数),并根据该函数返回true的元素来删除元素;
下面看一下直接循环删除;使用for循环的倒序删除;使用RemoveAll删除;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace xhdel
{
public partial class Form1 : Form
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 17, 88, 199};
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
textBox1.Text = String.Join(",", numbers);
}
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < numbers.Count; i++)
{
if (numbers[i] % 2 == 0) // 假设我们要删除所有偶数
{
numbers.RemoveAt(i);
}
}
textBox2.Text = String.Join(",", numbers);
numbers = new List<int> { 1, 2, 3, 4, 5, 17, 88, 199, 201 };
for (int i = numbers.Count - 1; i >= 0; i--)
{
if (numbers[i] % 2 == 0) // 假设我们要删除所有偶数
{
numbers.RemoveAt(i);
}
}
textBox3.Text = String.Join(",", numbers);
numbers = new List<int> { 1, 2, 3, 4, 5, 17, 88, 199, 303 };
numbers.RemoveAll(n => n % 2 == 0);
textBox4.Text = String.Join(",", numbers);
}
}
}
在这里看上去直接循环删除也没错;
为保险起见还是使用倒序比较好;
如果满足条件,使用RemoveAll比较简洁;