C#遍历List并删除某个或者几个元素的方法,你的第一反应使用什么方法实现呢?
foreach? for?
我的做法是用for倒序遍历,根据条件删除。
下面我们用代码来演示foreach,for删除 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的学生
希望这篇文章能对你有帮助,抛砖引玉,如果你有更好的方法解决这个问题欢迎在评论分享哈~