使用C# Linq的确给我们带来了很多的方便,但是如果不合理使用,会造成一些隐藏的bug,而且很难被发现。
今天我就分享一个工作中遇到的问题。
需求:对list进行遍历,把满足某一条件的item Remove掉。
List<ClassA> list = new List<ClassA>();
for (int i = 0; i < 1000; i++)
{
list.Add(new ClassA());
}
il.ForEach(x => il.Remove(x));
为了简化代码,在此不加条件语句。
以上代码貌似是把list中所有的item都Remove掉,但其实不然。
可以看到在执行完ForEach之后list中还有500项。
想必高手们应该之后了吧?在对list进行删除的时候,list整个集合的index已经发生了变化。
Remove一次,原来集合的index就会整体向前移动一个。
原index:
3,4,5,6
Remove()后
index:
2,3,4,5
其实以上代码等价于:
List<IA> list = new List<IA>();
for (int i = 0; i < 1000; i++)
{
list.Add(new ClassA());
}
for (int i = 0; i < 500; i++)
{
list.Remove(list[i]);
}
所以大家应该知道什么原因了吧?
所以应对以上bug,并且使用简介的Linq,正确的办法是:
for (int i = 0; i <list.Count; i++)
{
if (list[i].a==0)
{
list.RemoveAt(i);
i--;
}
}
list.ToList().ForEach(x => {
if (x.a==0)
{
list.Remove(x);
}
});
ToList()会new 一个list,然后对新的list进行遍历,删除旧list中与之对应index的值,至少这样的写法是对的。但是最优的办法是使用List<T>中的RemoveAll(Predicate<T> match)方法,该方法还会return 被删除的items的个数。
list.RemoveAll(x => x.a == 0);
分享到:
相关推荐
亲测好用,利用c# 的LinqXML技术 使用LINQ技术对XML文件进行读取
c#Linq操作数组 c#Linq操作数组 c#Linq操作数组
C#关于Linq学习,里面含有经典教程的具体代码,有清晰的教程pdf文件,同时含有数据库,欢迎分享。
学习LINQ工具,可以实时编译C#LINQ语句
C# linq对单级和多级节点的xml进行查询、更新等操作
C# Linq 示例代码大全 【官方】C# Linq 示例代码大全 【官方】
C# silverlight版本linq语法的经典使用方法
C# LINQ 语言规范 文档 XMLSQL中文
◦LINQ to SQL 概述(适用于 C# 和 VB) ◦标准查询运算符 ◦LINQ to XML 概述 •WinFormsDataBinding: 学习如何在 Windows 窗体中使用网格显示 LINQ 查询。它包括一个一对多查询示例。 •XQuery: 另一个简单的 LINQ ...
亲测好用,利用c# 的LinqXML技术 使用LINQ技术修改XML文件中
亲测好用,利用c# 的LinqXML技术 使用LINQ技术创建XML文件
自动生成C# LINQ 实体映射的工具,可用于linq查询,数据库增删改查
数据库 C#linq基础程序程序练习案例.rar
比较好的LINQ学习资源。比较好的讲述了LINQ在各个方面的使用方法。
C# LinqXML查找指定名称的元素C# LinqXML查找指定名称的元素
C# LinqXML查找根元素C# LinqXML查找根元素C# LinqXML查找根元素
自己写的一点LINQ的东西和大家分享一下。
linq to sql 标准实例,有兴趣的可以学习下
c#linq语法使用及实例,自己工作总结,最常用的几种语法,可供大家参考学习
使用linq实现对SQL Server数据库的增加、删除、更改、查询,程序简单易懂,非常适合初学者。