关于C#里List<T>.ForEach和foreach的3个区别,你可能还不知道!

Coding-145

前言

嗨,大家好!

在 C# 编程的旅途中,遍历集合几乎是每个程序员的日常。

无论是处理用户输入、操作数据库记录,还是简单的数据处理,我们经常需要遍历集合中的每个元素。

今天,我们要聊的就是两个常用来遍历集合的好兄弟:List<T>.ForEachforeach

它们都可以用于遍历集合或数组中的元素,但它们各自有什么特点呢?什么时候用哪个更好呢?

让我们一起来看看!

基本认识

  1. List.ForEach

    List<T>.ForEachList<T> 类中的一个方法,允许你对列表中的每个元素执行一个指定的动作。

    通过传递一个 Action 委托,它极大地简化了代码的编写。

    比如假设我们有一个 List<int>,我们想打印出每个元素的平方,使用 List<T>.ForEach 可以这样写:

    using System;
    using System.Collections.Generic;
    
    class Program
    {
        static void Main()
        {
            List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
    
            numbers.ForEach(number => Console.WriteLine(number * number));
        }
    }
    
  2. foreach

    foreach 是 C# 语言的一个关键字,能够遍历任何实现了 IEnumerable 接口的集合。

    关于 foreach 更多知识,可以参考我前面的一篇文章《C# 中 foreach 循环和 for 循环深度比较

主要区别

  1. 语法风格

    List<T>.ForEach 更像是函数式编程的风格,特别适合处理集合中的操作。

    foreach 提供了更直观、可读的语法。比较一下以下的代码:

    // List.ForEach 示例
    var numbers = new List<int> { 1, 2, 3, 4, 5 };
    numbers.ForEach(n => Console.WriteLine(n));
    
    // foreach 示例
    foreach (var n in numbers)
    {
        Console.WriteLine(n);
    }
    
  2. 灵活性

    foreach 可以在循环中使用 breakcontinue 来控制循环的进行。

    相对而言,List.ForEach 则缺乏这种直接控制的能力,只能在回调函数中执行具体逻辑。例如:

    foreach (var n in numbers)
    {
        if (n == 3) break; // 可以中止循环
        Console.WriteLine(n);
    }
    
    // List<T>.ForEach 无法实现中止
    numbers.ForEach(n =>
    {
        if (n == 3) return; // 这只是跳过当前回调,不是中止
        Console.WriteLine(n);
    });
    
  3. 性能

    List<T>.ForEach 在遍历时会创建额外的委托实例,因此在处理大量数据时,foreach 在性能上更高效一些。

使用场景

  1. List.ForEach

    当你想用简洁的代码快速处理 List 元素且不需要控制循环时,用 List<T>.ForEach 是个不错的选择。比如说,你想把所有数字乘以 2:

    numbers.ForEach(n => Console.WriteLine(n * 2));
    
  2. foreach

    当需要更复杂的控制逻辑时(例如,用 breakcontinue),使用 foreach 会更合适。假如你只想处理前 3 个元素,foreach 就是你的最佳选择。

    int count = 0;
    foreach (var n in numbers)
    {
      if (count++ >= 3) break;
      Console.WriteLine(n);
    }
    

注意事项与建议

  1. 无论使用 List<T>.ForEach 还是 foreach,都要注意不要在循环体内修改集合本身,这可能引发意外的错误

  2. 如果是简单操作,选择 List<T>.ForEach 可以让代码更加简洁

  3. 如果涉及复杂逻辑,foreach 则更加灵活

  4. 在处理庞大的集合时,建议优先使用 foreach

总结

总的来说,List<T>.ForEachforeach 在特定的场景下各有优势,希望这篇文章能帮助你在实际开发中更好地运用这两种方法。

好了,今天的分享就到这里啦,如果觉得有用,别忘了点个【赞与在看】哦,你的支持是我最大的动力!

最后,如果你有更好的想法或建议,欢迎留言讨论!

往期精彩

  1. 把 C# 里的 HttpClient 封装起来,告别复杂的配置,让 Restful API 调用更轻松更高效
  2. C#12 中 5 个节省你开发时间的的改进
  3. C# 静态类,高手不想让你知道的 15 个真相
  4. 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
  5. 用 C# Stopwatch 计时,让代码性能飞起来!
  6. 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
  7. 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
  8. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  9. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
  10. C# AutoMapper 10个常用方法总结
  11. C# 7个方法比较两个对象是否相等
  12. C# 去掉字符串最后一个字符的 4 种方法

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎点击下方卡片关注老杨的公众号(名称:代码掌控者),更多干货等你来!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值