咨询区

  • 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 ?相关推荐

  1. c html循环ienumerable,C#方法返回IEnumerable实现用foreach遍历

    在C#中,只要函数返回IEnumerable,就能实现用foreach对元素进行遍历,代码如下 public class ReturnIEnumerable { public IEnumerable ...

  2. 2021年了,`IEnumerator`、`IEnumerable`接口还傻傻分不清楚?

    IEnumerator.IEnumerable这两个接口单词相近.含义相关,傻傻分不清楚. 入行多年,一直没有系统性梳理这对李逵李鬼. 最近本人在怼着why神的<其实吧,LRU也就那么回事> ...

  3. C#学习常用方法(3000)---Foreach ,in

    foreach 语句对实现 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<T> 接口的数组 ...

  4. C# —— IEnumerable和状态机

    在上一篇文章中,我们看了一下枚举器以及.NET如何使用foreach循环,我们看到了枚举器实际上是如何通过使用MoveNext方法和Current属性从一个状态转换到另一个状态的对象. 我们知道,如果 ...

  5. ICollection IEnumerable/IEnumerator IDictionaryEnumerator yield

    Enumerable和IEnumerator接口是.NET中非常重要的接口,二者区别: 1. IEnumerable是个声明式的接口,声明实现该接口的类就是"可迭代的enumerable&q ...

  6. C# IEnumerator和IEnumerable的区别

    C#有很多接口 ,这些接口牵扯一些复杂的算法问题,让很多新手对这些接口很难理解,尤其是IEnumerator和IEnumerable这两个接口,在IEnumeratorIEnumerable会让新手很 ...

  7. C#编程(三十五)----------foreach和yield

    枚举 在foreach语句中使用枚举,可以迭代集合中的元素,且无需知道集合中的元素个数. 数组或集合实现带GetEumerator()方法的IEumerable接口.GetEumerator()方法返 ...

  8. html中foreach遍历list,foreach遍历----for(object o: list)

    Foreach遍历 前天在项目中遇到一个问题,foreach遍历过程中修改responses中的对象,其中responses的类型:IEnumerable,代码如下: foreach (Orde .. ...

  9. 关于Foreach是如何实现的问题

    在探讨foreach如何内部如何实现这个问题之前,我们需要理解两个C#里边的接口,IEnumerable 与 IEnumerator. 在C#里边的遍历集合时用到的相关类中,IEnumerable是最 ...

最新文章

  1. matlab 求x y关系,怎么用MATLAB建立数据间的函数关系
  2. UA OPTI501 电磁波 LIH介质中的平面波1 平面波的性质
  3. 计算机基础知识作业,第一章计算机基础知识作业
  4. 源码解读_Go Map源码解读之Map迭代
  5. Mac Sublime Vim模式 方向键无法长按
  6. jsp mysql简单登录_简单的登录页面,实现增删改查运用jsp/servlet和mysql数据库免费分享...
  7. Source Insight下载及注册码
  8. c#软件操作-cmd命令全解
  9. 300字简单区分线程问题
  10. 仿某某网站模板thinkphp_7个免费PPT模板网站,远离撞P的尴尬
  11. 两个WebUserControl之间传值
  12. seaweedfs问题处理
  13. Linux 知识地图
  14. 解决IDEA运行后报找不到应用程序错误
  15. BZOJ 2144 跳跳棋(LCA+欧几里德+二分答案)
  16. 项目管理知识体系九大知识领域简介
  17. 机器视觉halcon——距离测量
  18. HTML px em pt长度单位(像素 相对长度 点)
  19. wow转服务器微信支付,魔兽打团本成就,打到一半,发微信支付宝要钱,真国服之耻!...
  20. 软件测试经验图谱硬技能之业务逻辑

热门文章

  1. Anaconda+vscode+pytorch环境搭建
  2. nginx 注释配置及详解
  3. java 通过cookie判断是否登陆
  4. Java快速入门-01-基础篇
  5. css animation动画
  6. SSM框架搭建(四) springmvc和mybatis的配置
  7. div方框弯曲边样式_使用弯曲样式编辑文本
  8. gmail收件箱标签设置_通过多个收件箱实验室有效管理您的Gmail
  9. ios 启用 证书_如何在iOS 10中启用就寝提醒,轻柔的唤醒和睡眠跟踪
  10. 第五章 了解你的用户