`

C# Linq ForEach 使用请注意

 
阅读更多

使用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#使用linq查询大数据集的方法

    这种方法可以模拟一个大数据集,但请注意,在实际应用中,数据集可能来源于数据库、文件或其他数据源。 接下来,我们展示了如何使用LINQ查询从这个大数据集中筛选出所有小于2000的数字。查询表达式如下: ```...

    Linq两个List集合取交集的实现

    排序操作可以通过`OrderBy`或`Sort`方法完成,但请注意这可能会增加额外的时间复杂度。 4、特殊情况处理 如果列表中存在重复元素,`Intersect`方法会保留每个交集元素的一个实例。如果需要去除重复项,可以在调用`...

    使用C#合并头结构一致的excel、csv文件

    请注意,如果需要处理.xls文件,你需要使用`NPOI`库,代码会有所不同,但基本思路是相似的。 总的来说,通过使用适当的库和理解文件格式,C#提供了强大的工具来处理和合并Excel及CSV文件。只要确保文件头结构一致,...

    C#调用google搜索服务的源码示例(winform)

    请注意,由于Google API的使用限制和费用,频繁或大量请求可能需要考虑使用API密钥管理和配额控制。此外,为了优化用户体验,可以考虑添加错误处理和进度显示。 在提供的压缩包文件"china-code.net.lyf.50193"中,...

    c#反射机制的一种使用

    请注意,这个示例适用于WinForms或WPF等桌面应用,如果你正在使用Web应用,如ASP.NET,那么绑定方式可能会有所不同。 总结,C#的反射机制使得我们能够在运行时动态地访问和操作类型及其成员,这对于处理动态数据...

    c#读取xml文件增加结点删除节点并在listview中显示xml文件内容

    请注意,上述代码示例假设XML文件的结构简单,且没有复杂的嵌套。在实际应用中,可能需要根据XML的结构进行更复杂的遍历和操作。另外,对于大型或频繁修改的XML文件,可能需要考虑使用`XmlDocument`的替代品,如`...

    C#中XML文件的树形显示

    请注意,这些代码片段是基于Windows Forms的,如果你在WPF或其他框架下工作,可能需要使用不同的控件和方法。但基本的思路——加载XML,创建树形视图,以及执行插入和删除操作——是通用的。 在实际项目中,为了...

    LINQ增删改

    如果需要在原地修改,可以使用`ForEach`方法,但请注意这不遵循LINQ的延迟执行特性。 ### 查询(Query) 查询是LINQ的核心,通过`from`、`where`、`select`等关键字,可以构建复杂的查询表达式。以下是一个简单的...

    c#去除string中的重复项的简单方法

    请注意,这种方法虽然简洁,但它创建了额外的中间序列,可能会在大数据量时影响性能。 总结来说,C#中去除字符串重复项的方法有多种,可以根据具体需求和性能要求选择合适的方式。字典和HashSet方法适用于内存和...

    c#获得控件绑定所有的事件并执行源码

    如果需要执行这些事件,我们可以创建一个方法来调用事件处理程序,但请注意,这通常不建议在常规代码中进行,因为事件的执行应由事件源自动触发。然而,在测试场景中,这可能非常有用。例如,以下代码片段展示了如何...

    C_中foreach遍历的用法2015 (2).docx

    如果你需要在遍历时改变元素,你可能需要使用传统的`for`循环或者使用其他方法,如Linq。 总的来说,`foreach`循环是C#中一个强大的工具,它简化了对集合和数组的遍历,使得代码更易读、更简洁。无论是处理简单的一...

    C# 参数按照ASCII码从小到大排序(字典序)

    在 C# 中,我们可以使用 Dictionary, string&gt; 来存储参数,然后使用 LINQ 语句按照 ASCII 码从小到大排序。这里的代码示例: ```csharp public static void requestPay() { Dictionary, string&gt; dics = new ...

    读取注册表二进制键值并分组显示_C#_注册表_

    请注意,这个例子是假设二进制数据的结构,实际应用中你需要根据具体的数据格式进行相应的处理。 综上所述,使用C#读取注册表中的二进制键值并进行分组显示涉及以下几个关键步骤: 1. 使用`RegistryKey`类访问...

    js对c#listbox排序

    在IT行业中,JavaScript(js)和C#是两种常见的编程语言...请注意,为了确保用户体验和数据一致性,排序过程中应考虑错误处理和用户反馈。同时,对于大型数据集,可能需要考虑分页、异步处理或优化排序算法以提高性能。

    C#百度OCR demo

    请注意,实际项目中还需要考虑错误处理、异常捕获、性能优化以及合规性问题。例如,处理网络请求失败的情况,或者限制调用API的频率以避免超出配额。此外,根据版权规定,合理使用识别出的文字信息,尊重用户隐私。 ...

    C#基础学习笔记

    请注意,枚举的值不能直接是int类型,但枚举类型的变量可以被强制转换为int类型。 接下来,我们讨论数组。数组是C#中存储相同类型数据集合的数据结构。例如,创建一个包含10个整数的数组: ```csharp int[] ...

    C#中通物流.rar

    请注意,你需要替换`YOUR_API_KEY`为实际的中通物流API密钥。 其次,从API获取的响应通常为JSON格式,因此需要使用JSON解析库,如Newtonsoft.Json或System.Text.Json。例如,使用Newtonsoft.Json进行解析: ```...

    百度翻译API(C#)

    请注意,实际使用时需要替换`_apiKey`和`_secretKey`为你的实际API密钥和安全密钥。 总结一下,使用百度翻译API在C#中实现翻译功能,主要涉及API的注册、请求构建、发送请求、解析响应以及错误处理。通过以上步骤,...

    C#实现多国语言的界面切换 xml配置 WINFORM

    在C#中开发Windows Forms...请注意,实际项目中可能需要处理更多复杂情况,如处理未找到对应语言文本的情况、优化性能等。此外,为了便于管理,可以将XML文件和资源管理的代码封装到单独的类库中,以供多个项目复用。

    网络搜索歌曲并实现播放

    请注意替换`http://api.example.com/search`为实际API的URL,并处理好参数的编码。 得到返回的歌曲列表后,你需要解析数据。C#提供Json.NET库或内置的System.Text.Json,可以方便地将JSON数据转换为对象。例如,...

Global site tag (gtag.js) - Google Analytics