【C#】C#遍历List并删除某个或者几个元素的方法

本文介绍了在C#中如何正确删除List中的元素,特别是针对姓名为'Tang'的学生。通过对比foreach和for循环的删除方式,强调了在foreach中删除元素会导致异常,而for循环需要倒序遍历才能正确删除所有匹配项。最后展示了正确删除所有'Tang'学生的方法,即使用for循环倒序遍历。
摘要由CSDN通过智能技术生成

C#遍历List并删除某个或者几个元素的方法,你的第一反应使用什么方法实现呢?

foreach? for?

我的做法是用for倒序遍历,根据条件删除
下面我们用代码来演示foreachfor删除 list 数据 的情况:

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 + " ");

打印结果:
删除前:Tom Tang Tang Trista Lili
删除后:Tom Tang Trista Lili

只删除了一个姓名为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]);
}

打印结果:
删除前:Tom Tang Tang Trista Lili
删除后:Tom Trista Lili

这时删除了全部姓名为Tang的学生

希望这篇文章能对你有帮助,抛砖引玉,如果你有更好的方法解决这个问题欢迎在评论分享哈~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值