当前位置: 首页 > article >正文

C#编程:List.ForEach与foreach循环的深度对比

在C#中,List<T>.ForEach 方法和传统的 foreach 循环都用于遍历列表中的元素并对每个元素执行操作,但它们之间有一些关键的区别。

List<T>.ForEach 方法

  • 方法签名public void ForEach(Action<T> action)
  • 类型ForEachList<T> 类的一个实例方法。
  • 线程安全:不是线程安全的。如果在遍历过程中修改了列表(例如添加或删除元素),可能会导致异常。
  • 委托:它接受一个 Action<T> 委托,该委托定义了要对列表中的每个元素执行的操作。
  • 异常处理:如果委托在执行过程中抛出异常,它将传播到调用 ForEach 的代码,并且遍历会停止。

传统的 foreach 循环

  • 语法foreach (var item in collection)
  • 类型foreach 是C#语言的一个关键字,用于遍历实现了 IEnumerable<T>IEnumerable 接口的集合。
  • 线程安全:同样不是线程安全的,但提供了更多的灵活性来在循环体内处理异常和修改集合(尽管这通常是不推荐的做法,因为它可能导致未定义的行为)。
  • 灵活性:可以在循环体内使用 breakcontinuereturn 语句来控制循环的流程。
  • 异常处理:可以在循环体内捕获和处理异常,而不会立即停止整个遍历。

举例说明

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

        // 使用 List.ForEach 方法
        numbers.ForEach(number =>
        {
            Console.WriteLine(number);
            // 注意:这里不能使用 break、continue 或 return 来控制循环
        });

        // 使用传统的 foreach 循环
        foreach (var number in numbers)
        {
            Console.WriteLine(number);

            // 可以使用 break、continue 或 return
            // if (number == 3) break; // 这将跳出循环
            // if (number == 3) continue; // 这将跳过当前迭代并继续下一次
            // if (number == 3) return; // 这将退出整个方法(如果这是在方法内部)
        }

        // 另一个例子:异常处理
        try
        {
            numbers.ForEach(number =>
            {
                if (number == 3) throw new InvalidOperationException("Number 3 is not allowed.");
                Console.WriteLine(number);
            });
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception caught in ForEach: " + ex.Message);
        }

        try
        {
            foreach (var number in numbers)
            {
                if (number == 3)
                {
                    // 可以在这里捕获异常,或者让异常传播出去
                    // throw new InvalidOperationException("Number 3 is not allowed.");
                    Console.WriteLine("Skipping number 3 due to potential issue.");
                    continue; // 选择跳过数字3而不是抛出异常
                }
                Console.WriteLine(number);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception caught in foreach: " + ex.Message);
        }
    }
}

在这个例子中,List.ForEach 方法简洁地遍历了列表并对每个元素执行了操作,但它不允许控制循环的流程(如使用 breakcontinuereturn)。传统的 foreach 循环提供了更多的灵活性,包括异常处理和循环控制。


http://www.kler.cn/a/517083.html

相关文章:

  • 高并发处理 --- 超卖问题+一人一单解决方案
  • 【EXCEL_VBA_实战】多工作薄合并深入理解
  • 20250122-正则表达式
  • 基于 Android 的校园闲置物品交易平台设计与实现
  • [Unity 热更方案] 使用Addressable进行打包管理, 使用AssetBundle进行包的加载管理.70%跟练
  • Android SystemUI——最近任务应用列表(十七)
  • vim在命令模式下的查找功能
  • Redis内部数据结构--跳表详解
  • 【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScriptJava PythonC/C++)
  • 【算法篇】从汉明重量的基础理解到高效位运算优化详解
  • AI如何帮助解决生活中的琐碎难题?
  • 智能风控 数据分析 groupby、apply、reset_index组合拳
  • Cosmos学习记录
  • Databend x 沉浸式翻译 | 基于 Databend Cloud 构建高效低成本的业务数据分析体系
  • C++/CLI(Common Language Runtime)关键点详解
  • JDK14特性Java 原生代码编译工具jpackage
  • SpringBoot自定义实现触发器模型的starter
  • 【期末速成】软件设计模式与体系结构
  • 把网站程序数据上传到服务器的方法和注意事项
  • 针对业务系统的开发,如何做需求分析和设计?
  • 【数据结构】_基于顺序表实现通讯录
  • 在Docker 容器中安装 Oracle 19c
  • 编译Android平台使用的FFmpeg库
  • 【玩转全栈】----YOLO8训练自己的模型并应用
  • 6. 马科维茨资产组合模型+政策意图AI金融智能体(DeepSeek-V3)增强方案(理论+Python实战)
  • (详细)Springboot 整合动态多数据源 这里有mysql(分为master 和 slave) 和oracle,根据不同路径适配不同数据源