前言
嗨,大家好!
在 C# 编程的旅途中,遍历集合几乎是每个程序员的日常。
无论是处理用户输入、操作数据库记录,还是简单的数据处理,我们经常需要遍历集合中的每个元素。
今天,我们要聊的就是两个常用来遍历集合的好兄弟:List<T>.ForEach
和 foreach
。
它们都可以用于遍历集合或数组中的元素,但它们各自有什么特点呢?什么时候用哪个更好呢?
让我们一起来看看!
基本认识
-
List.ForEach
List<T>.ForEach
是List<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)); } }
-
foreach
foreach
是 C# 语言的一个关键字,能够遍历任何实现了IEnumerable
接口的集合。关于
foreach
更多知识,可以参考我前面的一篇文章《C# 中 foreach 循环和 for 循环深度比较》
主要区别
-
语法风格
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); }
-
灵活性
foreach
可以在循环中使用break
或continue
来控制循环的进行。相对而言,
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); });
-
性能:
List<T>.ForEach
在遍历时会创建额外的委托实例,因此在处理大量数据时,foreach
在性能上更高效一些。
使用场景
-
List.ForEach
当你想用简洁的代码快速处理 List 元素且不需要控制循环时,用
List<T>.ForEach
是个不错的选择。比如说,你想把所有数字乘以 2:numbers.ForEach(n => Console.WriteLine(n * 2));
-
foreach
当需要更复杂的控制逻辑时(例如,用
break
或continue
),使用foreach
会更合适。假如你只想处理前 3 个元素,foreach
就是你的最佳选择。int count = 0; foreach (var n in numbers) { if (count++ >= 3) break; Console.WriteLine(n); }
注意事项与建议
-
无论使用
List<T>.ForEach
还是foreach
,都要注意不要在循环体内修改集合本身,这可能引发意外的错误 -
如果是简单操作,选择
List<T>.ForEach
可以让代码更加简洁 -
如果涉及复杂逻辑,
foreach
则更加灵活 -
在处理庞大的集合时,建议优先使用
foreach
总结
总的来说,List<T>.ForEach
和 foreach
在特定的场景下各有优势,希望这篇文章能帮助你在实际开发中更好地运用这两种方法。
好了,今天的分享就到这里啦,如果觉得有用,别忘了点个【赞与在看】哦,你的支持是我最大的动力!
最后,如果你有更好的想法或建议,欢迎留言讨论!
往期精彩
- 把 C# 里的 HttpClient 封装起来,告别复杂的配置,让 Restful API 调用更轻松更高效
- C#12 中 5 个节省你开发时间的的改进
- C# 静态类,高手不想让你知道的 15 个真相
- 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
- 用 C# Stopwatch 计时,让代码性能飞起来!
- 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
- 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
- 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
- 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
- C# AutoMapper 10个常用方法总结
- C# 7个方法比较两个对象是否相等
- C# 去掉字符串最后一个字符的 4 种方法
我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎点击下方卡片关注老杨的公众号(名称:代码掌控者),更多干货等你来!