为什么 IEnumerable 没有提供 ForEach ?
咨询区
Cameron MacFarland:
为什么 IEnumerable
接口没有 ForEach
扩展方法?我观察到能获取 ForEach 方法的类是 List<>
,有谁知道这么设计的原因吗,是为了性能?
回答区
aku:
ForEach
方法其实在 Linq 之前就已经存在了,如果这时候在 IEnumerable 上添加 ForEach 扩展方法的话会出现什么结果呢?大家应该知道扩展方法的优先级是低于同名的非扩展方法,这就意味着 IEnumerable 下的 ForEach 永远得不到调用。
如果你真的想要这个功能,可以自己实现一个。
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{foreach (T element in source) action(element);
}
leppie:
大多数 Linq 扩展方法都会返回 result,但 ForEach 这种不返回的扩展方法并不适合在这种模式中。
Martijn:
你可以使用链式延迟的 Select
来替换 ForEach
, 比如下面这样。
IEnumerable<string> people = new List<string>(){"alica", "bob", "john", "pete"};
people.Select(p => { Console.WriteLine(p); return p; });
如果要立即执行的话,可以再调用 Count()
,据我所知这是触发迭代最小代价的方法,当然你可以调用你需要的立即执行方法。
不过我倒希望下面的扩展方法被引入到标准类库中。
static IEnumerable<T> WithLazySideEffect(this IEnumerable<T> src, Action<T> action) {return src.Select(i => { action(i); return i; } );
}
上面的代码等价于 foreach,不过是链式延迟的。
点评区
Linq 不提供 ForEach 扩展方法,我感觉是设计者故意为之的,Linq 的一个强大特性在于可链式,可延迟,它和 ForEach 中间还差了一个 ToList,也许手工 ToList 可以让代码意图更明显吧,比如:
static void Main(string[] args){IEnumerable<Person> list = new List<Person>();list.Where(v => v.Name == "xxx").ToList().ForEach(m => Console.WriteLine(m.Name));}
当然你不认同这种理念也没关系,很多的 Linq 扩展库也不认同,它们就直接提供了 ForEach,比如:MoreLinq https://github.com/morelinq/
原文链接:https://stackoverflow.com/questions/101265/why-is-there-no-foreach-extension-method-on-ienumerable#101303
为什么 IEnumerable 没有提供 ForEach ?相关推荐
- c html循环ienumerable,C#方法返回IEnumerable实现用foreach遍历
在C#中,只要函数返回IEnumerable,就能实现用foreach对元素进行遍历,代码如下 public class ReturnIEnumerable { public IEnumerable ...
- 2021年了,`IEnumerator`、`IEnumerable`接口还傻傻分不清楚?
IEnumerator.IEnumerable这两个接口单词相近.含义相关,傻傻分不清楚. 入行多年,一直没有系统性梳理这对李逵李鬼. 最近本人在怼着why神的<其实吧,LRU也就那么回事> ...
- C#学习常用方法(3000)---Foreach ,in
foreach 语句对实现 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<T> 接口的数组 ...
- C# —— IEnumerable和状态机
在上一篇文章中,我们看了一下枚举器以及.NET如何使用foreach循环,我们看到了枚举器实际上是如何通过使用MoveNext方法和Current属性从一个状态转换到另一个状态的对象. 我们知道,如果 ...
- ICollection IEnumerable/IEnumerator IDictionaryEnumerator yield
Enumerable和IEnumerator接口是.NET中非常重要的接口,二者区别: 1. IEnumerable是个声明式的接口,声明实现该接口的类就是"可迭代的enumerable&q ...
- C# IEnumerator和IEnumerable的区别
C#有很多接口 ,这些接口牵扯一些复杂的算法问题,让很多新手对这些接口很难理解,尤其是IEnumerator和IEnumerable这两个接口,在IEnumeratorIEnumerable会让新手很 ...
- C#编程(三十五)----------foreach和yield
枚举 在foreach语句中使用枚举,可以迭代集合中的元素,且无需知道集合中的元素个数. 数组或集合实现带GetEumerator()方法的IEumerable接口.GetEumerator()方法返 ...
- html中foreach遍历list,foreach遍历----for(object o: list)
Foreach遍历 前天在项目中遇到一个问题,foreach遍历过程中修改responses中的对象,其中responses的类型:IEnumerable,代码如下: foreach (Orde .. ...
- 关于Foreach是如何实现的问题
在探讨foreach如何内部如何实现这个问题之前,我们需要理解两个C#里边的接口,IEnumerable 与 IEnumerator. 在C#里边的遍历集合时用到的相关类中,IEnumerable是最 ...
最新文章
- matlab 求x y关系,怎么用MATLAB建立数据间的函数关系
- UA OPTI501 电磁波 LIH介质中的平面波1 平面波的性质
- 计算机基础知识作业,第一章计算机基础知识作业
- 源码解读_Go Map源码解读之Map迭代
- Mac Sublime Vim模式 方向键无法长按
- jsp mysql简单登录_简单的登录页面,实现增删改查运用jsp/servlet和mysql数据库免费分享...
- Source Insight下载及注册码
- c#软件操作-cmd命令全解
- 300字简单区分线程问题
- 仿某某网站模板thinkphp_7个免费PPT模板网站,远离撞P的尴尬
- 两个WebUserControl之间传值
- seaweedfs问题处理
- Linux 知识地图
- 解决IDEA运行后报找不到应用程序错误
- BZOJ 2144 跳跳棋(LCA+欧几里德+二分答案)
- 项目管理知识体系九大知识领域简介
- 机器视觉halcon——距离测量
- HTML px em pt长度单位(像素 相对长度 点)
- wow转服务器微信支付,魔兽打团本成就,打到一半,发微信支付宝要钱,真国服之耻!...
- 软件测试经验图谱硬技能之业务逻辑