首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么IEnumerable上没有ForEach扩展方法?

IEnumerable上没有ForEach扩展方法,因为它本身就是一个集合遍历的方法,而不需要再进行遍历。

IEnumerable是C#中的一种序列类型,其中包含的元素可以使用迭代器进行遍历。对于IEnumerable的遍历有多种方式,最基本的是使用foreach循环进行遍历。而在forEach方法,它是用于将一个迭代器传递给IEnumerable类型的所有元素,并返回一个IEnumerable类型的结果。但是,forEach方法并不是IEnumerable方法组中的成员,因此不能直接在IEnumerable对象上进行调用。

虽然IEnumerable本身没有提供forEach遍历,但是在C#中可以使用LINQ语言扩展语法来实现相同的功能。例如,可以使用.Where、.Select、.Single等LINQ查询扩展方法对IEnumerable中的元素进行筛选和过滤,从而实现ForEach相同的功能。

总之,在C#中,要完成对IEnumerable类型的遍历操作,可以通过foreach循环进行遍历,也可以通过LINQ语言扩展语法进行遍历。而forEach方法不适用于IEnumerable对象,因此不能在IEnumerable类型上使用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【手记】走近科学之为什么明明实现了IEnumerable的类型却不能调用LINQ扩展方法

比如Json.NET的JObject明明实现了IEnumerable,具体来说是IEnumerable>,按说JObject类型的对象是可以直接调用...Select、Where等linq扩展方法的,但偏偏就是不行,代码如下: using System.Linq; ... var jobj = new JObject(); var xxx = jobj.Select...(x=>x); //报错:JObject未包含Select定义,也不存在第1个参数为JObject的Select扩展方法... foreach(var x in jobj) { } //可以 var xxx...答案就在: 因为JObject除了本身实现了一个IEnumerable>,它实现的另一个接口JContainer也实现了一个IEnumerable...,等于JObject直接和间接实现了两个不同的IEnumerable,当.Select的时候编译器不能确定调用哪个类型的Select,所以就这样了。

78310

IEnumerable 使用foreach 详解

自己实现迭代器 yield的使用 怎样高性能的随机取IEnumerable中的值 我们先思考几个问题: 为什么foreach中不能修改item的值? 要实现foreach需要满足什么条件?...好吧,我们来使用foreach循环: ? 为什么说基本是等效的呢?我们先看打印结果,在看反编译代码。 ? ? 由此可见,两者有这么个关系: ?...我们可以回答第一个问题了“为什么foreach中不能修改item的值?”: ? 我们还记得IEnumerator的定义吗 ? 接口的定义就只有get没有set。...执行到MyWhere的时候什么动作都没有(返回的就是IEnumerable),只有执行到ToList的时候才代码才真正的去遍历筛选。 这里的MyWhere其实可以用扩展方法来实现,提升逼格。...(Linq的那些查询操作符就是以扩展的形式实现的)[了解扩展方法]。 怎样高性能的随机取IEnumerable中的值 ? 这段代码来源《深入理解C#》,个人觉得非常妙。贴出来给大家欣赏哈。

1.7K40

.NET面试题系列 - IEnumerable

Enumerable这个静态类型含有很多扩展方法,其扩展的目标是IEnumerable。...想知道如何实现方法GetEnumerator,不妨思考下实现了GetEnumerator之后的类型在Foreach之下的行为: 可以获得第一个或当前成员 可以移动到下一个成员 可以在集合没有下一个成员时退出循环...而且会出现一个问题,就是你无法知道集合的大小(IEnumerable没有Count方法,只有IEnumerable才有)。...后面因为已经没有新的元素了,yield也就不执行了,整个Foreach循环将什么都不做。 yield的延迟执行特性 – 本质是一个状态机 关键字yield只有当真正需要迭代并取到元素时才会执行。...原文中,也有实验证明了vector创建了六次,实际每次迭代都会创建三个新的vector。 解决这个问题的方法是将IEnumerable转为其子类型例如List或数组。

61820

为什么private方法加了@Transactional,事务没有生效?

你可能曾经遇到过在一个 private 方法加了 @Transactional 注解,但最终发现事务并没有按照你的期望生效的情况。...在本文中,我将深入探讨为什么 private 方法的 @Transactional 注解不生效,以及如何解决这个问题。 问题的背后 首先,让我们来理解为什么会出现这个问题。...但是,对于 private 方法,由于其访问权限的限制,Spring 无法生成代理对象,因此事务也无法正常生效。 为什么 private 方法无法生成代理对象?...将 @Transactional 注解移到 public 方法 最简单的解决方法是将 @Transactional 注解移到调用 private 方法的 public 方法。...希望本文能够帮助你更好地理解为什么 private 方法的 @Transactional 注解不生效,以及如何解决这个问题。如果你有任何问题或建议,欢迎在评论中与我分享。谢谢阅读!

1K40

【错误记录】Groovy 扩展方法调用报错 ( 静态扩展方法 或 实例扩展方法 需要分别配置 | 没有配置调用会报错 groovy.lang.MissingMethodException )

文章目录 一、报错信息 二、解决方案 一、报错信息 ---- 定义 Thread 扩展方法 , 下面的扩展方法 class ThreadExt { public static Thread hello...org.codehaus.groovy.runtime.ExtensionModule 配置文件中 , 只配置了 moduleName=groovyExt moduleVersion=1.0 extensionClasses=ThreadExt 对象实例扩展方法..., 在 Groovy 脚本中调用 Thread 静态扩展方法 , Thread.hello{ printf "Hello" } 报如下错误 : HelloCaught: groovy.lang.MissingMethodException...main\groovy\manifest\META-INF\services\org.codehaus.groovy.runtime.ExtensionModule 配置文件中 , 同时配置静态和实例扩展方法...extensionClasses=ThreadExt staticExtensionClasses=ThreadExt 执行 groovyc -d classes ThreadExt.groovy 编译扩展

54010

Newbe.ObjectVisitor 0.2.10 发布,更花里胡哨

: //✔️ from 0.2 // 遍历指定类型的属性 o.V().ForEach((context) => {}); // 和一条完全一样 o.V().ForEach...o.V().ForEach>((context) => {}, x => x.IsOrImplOf>()); // 指定属性类型...,并包含一个扩展的参数 o.V().WithExtendObject().ForEach((context...) => {}); 基准测试 我们更新了两个基准测试: FormatString 实现进行了优化,现在 Quick Style 和自己手写 ObjectVisitor 已经几乎没有区别。...通过这个类库你可以使用链式API和命名方法来创建一个委托,这样可以让你的代码实现和硬编码同样的可读效果。 因为这样更具扩展性!如果使用了这个类库,你就拥有了一个简便的方法来访问一个类所有的属性。

31000

为什么private方法加了@Transactional,事务也没有生效?

现在产品期望用户创建和保存逻辑分离:把User实例的创建和保存逻辑拆到两个方法分别进行。 然后,把事务的注解 @Transactional 加在保存数据库的方法。...接着调用到 computeTransactionAttribute 根据方法和类的类型确定是否返回事务属性: 当上图中条件判断结果为 true,则返回 null,表明该方法不会被代理,从而导致事务注解不会生效...: PUBLIC: 1 PRIVATE: 2 PROTECTED: 4 这里做了一个位运算,只有当传入的方法修饰符是 public 类型的时候,才返回 true 综上两个条件,只有当注解为事务方法为...调用这个加了事务注解的方法,必须是调用被 Spring AOP 代理过的方法:不能通过类的内部调用或通过 this 调用。...所以我们的案例的UserService,它Autowired了自身(UserService)的一个实例来完成代理方法的调用。

1.2K30

IEnumerable和IQueryable区分

LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable接口的集合进行扩展;Queryable类,针对继承了...我们会发现接口IQueryable实际也是继承了IEnumerable接口的,既然这样微软为什么要设计出两套扩展方法呢?...从LINQ查询功能上我们知道实际可以分为三类:LINQ to OBJECTS、LINQ to SQL和LINQ to XML。...针对LINQ to OBJECTS 时,使用Enumerable中的扩展方法对本地集合进行排序和查询操作,查询参数接受的是Func,Func叫做谓语表达式,相当于一个委托。...针对LINQ to SQL时,则使用Queryable中的扩展方法,它接受的是Expression。 那么,到底什么时候使用IQueryable,什么时候使用IEnumerable

88020

“设备没有剩余空间” 导致登录不 SSH 的解决方法

最近给自己的服务器添加了新的电脑的 SSH 权限,但是新电脑反复尝试都不能 ssh 服务器。然而通过旧电脑却可以登录上去。没想到竟是因为设备没有 inode 了。 inode 是什么呢?...一般 UNIX 操作系统的每个目录、文件都会有一个“元信息”,存储了文件名、创建者、创建时间等等信息。而 inode 就是存储“元信息”的数据结构,这个 i 就是 index 的意思。...使用 df 命令解决“设备没有剩余空间”的报错 登录到服务器后,看到了“设备没有剩余空间”的报错,touch 一个新文件也报这个错,rm 删除东西时就一直卡住了。...我这次通过 du -sh 查找到 docker 相关的目录占了很多空间,而 docker 本身却打不开,所以先删掉了也占很大空间的/var/log/ 下的文件,其中 maillog 居然有 G 大小,...tail 了一下发现有好多 “设备没有剩余空间” 的日志。

2.5K10

.NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)

如果我们使用扩展方法那么只能是扩展IEnumerable对象,这没有问题。我们可以很方便的在LINQ的表达式中调用我们自己的扩展方法,让自己的方法跟着一起链式查询。...IQueryable继承自IEnumerable接口,也就是可以被foreach语法调用的,但是在GetEnumerator方法中才会去执行提供程序的代码。...3.2】.扩展方法扩展对象之奥秘(this IQueryable source) 其实这里有一个思维陷阱,当我们分析源码的时候只将焦点集中在扩展方法中的后面参数上,而没有集中精力考虑扩展方法扩展的对象本身...这是问题的重点,对扩展方法、链式编程不熟悉的朋友很难将source能串联到之前方法所返回的IQueryable对象。...根据3.2图中的意思,我们都已经知道扩展方法之间传输的对象都是来自不同的实例但是来自一个对象类型,那么为什么要分段执行每个关键字的操作呢?我们还是用图来帮助我们分析问题吧。 ?

1.4K11

了解LINQ

以及常见的用法大纲如下: LINQ的那些根基 LINQ的一些基本用法 LINQ的根基 IEnumerable和IEnumerator 为啥能够被foreach?...实际,能够被foreach的对象,一定是实现了带有返回值的IEnumerator的GetEnumerator()方法的接口,而.NET内置的该接口则是IEnumerable,一般指的是IEnumerable...的可被枚举的集合 LINQ的基本用法 扩展方法在LINQ的应用:LINQ的流式语法 LINQ的方法一般都是通过扩展方法扩展的,就如最常用的几个,Where,Any,例如,我实现了一个跟Where功能类似的简化版...func(item)) { yield return item; } } } } 其实为啥会提到用扩展方法呢...就是因为LINQ就是为了简单的能够处理复杂集合的数据,那么扩展方法就能够实现较为简单的链式查询,例如: var result= animals.MyWhere(t => t is "Cat" or "Dog

86320

LINQ驱动数据的查询功能

2.1 扩展方法       扩展方法赋予了程序设计语言可在现有类下扩展类的功能,且不需要修改原本程序代码。...实现扩展方法十分简单,只需要建立一个静态类,名称建议用 "要扩展的类名称"+Extension字样,例如扩展Int的方法,就将类名命名为Int32Extension,接下来在类内加入要扩展方法,但是要注意两件事...:       1.必须是静态方法,且名称不能和现有的方法冲突       2.参数至少有一个,且类型为扩展类型,格式是"this[要扩展的类名称][参数名称]",若有两个以上的参数,则扩展类型放在第一个不能设置默认值...> GetYieldResult(IEnumerable param) { foreach (var num in param)...yield return num; } } }       yield指令乍看之下只是精简写法,实际这个方法的执行推迟到真正查询才触发

2.9K90

C#规范整理·集合和Linq

List<T>基本没有提供可供子类使用的protected成员(从object中继承来的Finalize方法和Member-wiseClone方法除外),也就是说,实际,继承List<T>并没有带来任何继承的优势...在查询中使用Lambda表达式# LINQ实际是基于扩展方法和Lambda表达式的,理解了这一点就不难理解LINQ。...13.区别LINQ查询中的IEnumerable<T>和IQueryable<T># LINQ查询方法一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了...IEnumerable<T>接口的集合类进行扩展;Queryable类,它针对继承了IQueryable<T>接口的集合类进行扩展。...稍加观察我们会发现,接口IQueryable<T>实际也是继承了IEnumerable<T>接口的,所以,致使这两个接口的方法在很大程度上是一致的。那么,微软为什么要设计出两套扩展方法呢?

15130

Linq基础知识小记二

书写Linq查询有两种方法,第一种是通过方法语法(也就是扩展方法),第二种是查询表达式语法. 1、方法语法 方法语法就是通过扩展方法和Lambda表达式来创建查询 (1)、链式查询 这种查询方式很多语言都支持...(var n in result) { Console.WriteLine(n); } 链式查询的原理:一个词"扩展方法",核心是扩展方法,因为where、OrderBy、Select等扩展方法返回都是一个...IEnumerable类型对象,所以配合扩展方法本身的特殊性(不懂,请参考C# this关键字(给底层类库扩展成员方法)就实现了链式查询的功能.关于这个如果了解jQuery链式查询的可能更容易理解...,并编译成扩展方法,实质也是在使用扩展方法进行查询....上图是标准的查询表达式语法图 3、组合查询语法 因为查询表达式语法和扩展方法语法各有所长,其实本质查询表达式编译之后也是一种方法语法,两者是真包含的关系,所以使用起来可以根据自身的喜好来决定,但是当一个查询操作运算符没有对应的查询表达式语法时

1.3K70
领券