C#泛型List删除多个元素的方法
泛型List如果删除一个,很简单,直接 RemoveAt(index)即可。
但如果有多个元素,那么删除起来并不是特别简单。需要使用 for 循环的倒叙删除
例子如下:
class Program
{
public class Students
{
public string Name { get; set; }
public int Age { get; set; }
public Students(string name, int age)
{
this.Name = name;
this.Age = age;
}
}
static void Main(string[] args)
{
List<Students> stuList = new List<Students>();
stuList.Add(new Students("Tom",20));
stuList.Add(new Students("Tang", 20));
stuList.Add(new Students("Tang", 22));
stuList.Add(new Students("Trista", 24));
stuList.Add(new Students("Lili", 25));
//打印姓名
Console.Write("删除前:");
foreach (var stu in stuList)
Console.Write(stu.Name + " ");
Console.ReadKey();
}
}
打印结果:Tom Tang Tang Trista Lili
1.先用foreach遍历删除姓名为Tang的学生,代码如下:
foreach (var stu in stuList)
{
if (stu.Name == "Tang")
stuList.Remove(stu);
}
会报如下错误:
因为在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从需导致在foreach中删除元素会出现异常。
2.用for正序遍历删除,代码如下:
//打印姓名
Console.Write("删除前:");
foreach (var stu in stuList)
Console.Write(stu.Name + " ");
//删除姓名为Tang的学生
for (int i=0;i< stuList.Count;i++)
{
if (stuList[i].Name == "Tang")
stuList.Remove(stuList[i]);
}
//打印姓名
Console.Write("\n删除后:");
foreach (var stu in stuList)
Console.Write(stu.Name + " ");
结果:
只删除了一个姓名为Tang的学生。为什么会出现这种情况呢?
这是因为当i=1时,满足条件执行删除操作,会移除第一个Tang,接着第二个Tang会前移到第一个Tang的位置,即游标1对应的是第二个Tang。
接着遍历i=2,也就跳过第二个Tang。
3.用for倒序遍历删除,代码如下:
for (int i = stuList.Count-1; i>=0; i--)
{
if (stuList[i].Name == "Tang")
stuList.Remove(stuList[i]);
}
结果:
这时删除了全部姓名为Tang的学生。