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

为什么foreach语句接受实现"Collection"模式的对象而不是只接受实现IEnumerable的对象?

在C#编程语言中,foreach语句用于遍历集合中的每个元素。它接受实现IEnumerable接口的对象,这样可以方便地遍历集合。然而,IEnumerable接口并不是唯一的要求。foreach语句还接受实现Collection模式的对象。

Collection模式是一种设计模式,用于表示一组对象。它提供了一种方法来访问和操作这些对象,而不需要暴露底层的实现细节。实现Collection模式的对象通常具有以下特点:

  1. 提供了一种方法来访问集合中的元素,例如通过索引。
  2. 提供了一种方法来检查集合中是否存在特定元素。
  3. 提供了一种方法来添加和删除元素。

实现Collection模式的对象通常实现了IEnumerable接口,这使得它们可以与foreach语句一起使用。此外,实现Collection模式的对象还可以提供其他有用的方法和属性,例如Count属性,用于获取集合中的元素数量。

总之,foreach语句接受实现Collection模式的对象,因为这些对象通常实现了IEnumerable接口,并提供了一种方便的方法来访问和操作集合中的元素。这使得foreach语句可以方便地遍历这些集合。

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

相关·内容

.NET面试题系列 - IEnumerable

什么是IEnumerableIEnumerableIEnumerable泛型版本IEnumerable是一个接口,它含有一个方法GetEnumerator。...如何实现一个继承IEnumerable类型? 实现一个继承IEnumerable类型等同于实现方法GetEnumerator。...-1不是0 当前位置变量position显然应该是私有的 需要编写Current属性get方法取出当前位置(position)上集合成员 通过不断调试,最后完整实现应当是: public class...实际上下面两段代码作用是相同foreach (T item in collection) {   ... } IEnumerator enumerator = collection.GetEnumerator...从编译后代码我们发现,只要我们通过foreach迭代一个IEnumerable,我们就会跑到GetVectors方法中,每次运行GetVectors方法,yield都只会返回全新三个值为(1,1)

64420

重温设计模式 --- 迭代器模式

引言 迭代器模式是一种行为型设计模式,它允许按照特定顺序遍历集合对象元素,同时不暴露集合内部结构。这样做可以让客户端代码不依赖于集合对象具体实现,从而提高代码灵活性和可重用性。...在迭代器模式中,聚合对象将其遍历职责委托给迭代器对象不是在聚合对象实现遍历。 迭代器模式优点是可以支持以不同方式遍历一个聚合对象,而且可以隐藏遍历元素内部细节。...在 C# 中,迭代器模式可以通过实现IEnumerable和IEnumerator接口来实现。...它可以让我们轻松地遍历集合对象元素,不必暴露集合内部结构。此外,通过实现IEnumerable和IEnumerator接口,我们可以轻松地在 C# 中实现迭代器模式。...foreach是C#语法糖,用来遍历实现IEnumerable接口集合类。

12910
  • 迭代器模式

    迭代器模式定义 提供一种统一方法遍历一个集合中各个元素,不关心集合内部实现。 迭代器模式目的 在面向对象编程里,迭代器模式是一种最简单也最常见设计模式。...它可以让用户透过特定接口访问集合中每一个元素不用了解底层实现。一般实现一个集合方法有:数组,链表,哈希表等等,每种集合因为底层实现不同,遍历集合方法也不同。....NET Framework中迭代器模式应用 C#foreach语句其实就是迭代器模式。任何可以使用foreach进行遍历对象,它一定是实现IEnumerable接口。...任何实现IEnumerable接口对象集合都可以使用foreach遍历。...迭代器模式使用感受 迭代器模式是与集合类紧密绑定在一起,一般来说,我们只要实现一个集合类,就应该同时提供这个集合迭代器,就像C#中Collection,List、Set、Map等,这些集合都有自己迭代器

    64130

    LINQ驱动数据查询功能

    二、LINQ基础       LINQ本身以IEnumerable两个接口为基础,IEnumerable则负责泛型集合,目前.NET Framework内泛型集合类 System.Collection.Generic...对象初始化器:允许程序中通过声明方式直接给对象属性进行数值初始化,不必建立有参数构造函数。(字典类型必须按照特定格式初始化) 匿名类型:不定义类情况下生成新类,Linq中常用。...2.4 yield指令与延迟查询       微软提供了一个指令yield,它可以传回每个元素方式自动生成IEnumerable对象 private static IEnumerable.Join()实现,CROSS JOIN 由EnumerableSelectMany实现,还有一种Join模式没有考虑:LEFT...OUTER JOIN 模式,要实现这个模式必须借助GroupJoin()。

    2.9K90

    金三银四面试:C#.NET面试题中高级篇5-Linq和EF

    3.为什么用EF不用原生ADO.NET? 4.如何提高LINQ性能问题? 5.什么是IEnumerable? 6.IEnumerable缺点有哪些?...3).尽可能使用一条查询不是多条 4).只为了展示数据,不进行后续修改时,可以使用AsNoTracking。...IEnumerableIEnumerable泛型版本IEnumerable是一个接口,它含有一个方法GetEnumerator。...Enumerable这个静态类型含有很多扩展方法,其扩展目标是IEnumerable实现了这个接口类可以使用Foreach关键字进行迭代(迭代意思是对于一个集合,可以逐一取出元素并遍历之)。...为什么? 这个要结合EF特点来说:EF主要是以面向对象思想来做数据库数据操作,对Sql语句能力没什么要求,开发使用效率高!

    4.1K30

    枚举器与迭代器

    可枚举对象(enumerator object)是一序列逻辑表示,本身不是游标,但可以基于本身产生游标对象。如果要迭代可枚举对象,可以使用 foreach 语句。...可枚举对象可以是实现IenumerableIenumerable 对象,也可以是具有名为 GetEnumerator 方法并且方法返回一个枚举器对象。...最后使用枚举器 Current 属性获得游标指向值,并打印出来。打印结果如下: ? 如果枚举器实现了 IDisposable 接口,这时 foreach 语句可以隐式清理掉枚举对象。...System.Collections.IEnumerable 接口,并存在一个可以接受适当参数 Add 方法。...同理字典也可以通过集合初始化器进行对象初始化和元素填充。 一、迭代器 1.什么是迭代器 迭代器简化了对象通信,使得不关心序列类型,获得序列中每个元素。

    45110

    C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器

    nullableWithoutValue = null; 4 5 //获得可空对象类型, 此时返回是System.Int32, 不是System.Nullable...在C#1.0中, 一个类中要想使用foreach关键字进行遍历, 它必须实现IEnumerable或者IEnumerable接口....: 先来看一下IEnumerable接口,其实看过这个接口之后,发现它其实是非常简单,包含一个方法GetEnumerator(),它返回一个可用于循环访问集合IEnumerator对象,如下面代码所示...它是一个真正集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中项,假如连集合中项都访问不了,那么进行集合循环遍历是不可能事情了。...//Friends实现IEnumerable,所以可以使用foreach语句进行遍历 9 foreach (Friend f in friendCollection) 10

    1.2K110

    C#3.0新增功能06 对象和集合初始值设定项

    使用 C# 可以在单条语句中实例化对象或集合并执行成员分配。 对象初始值设定项 使用对象初始值设定项,你可以在创建对象时向对象任何可访问字段或属性分配值,而无需调用后跟赋值语句构造函数。...请注意,自动实现属性在 Cat 类中用法。...,这些对象可以在 foreach 语句中进行访问,如下面的示例所示: foreach(var p in productInfos){...}...select new {p.ProductName, Price = p.UnitPrice}; 集合初始值设定项 在初始化实现 IEnumerable 集合类型和初始化使用适当签名作为实例方法或扩展方法...请注意,它使用具有多个值对象不是带括号和赋值索引器语法: var moreNumbers = new Dictionary { {19, "nineteen"

    88310

    通过运行期类型检查实现泛型算法

    针对这一点 C# 允许在发现类型参数所表示对象具有更多功能时编写更具体代码。...DemoEnumerable 构造函数做了限制,要求它参数必须支持 IEnumerable ,因此我们要实现序列中元素倒叙访问就必须采用 GetEnumerator 种方式。...有时尽管参数实现了 IList 但是它编译期类型仍然是 IEnumerable,因此我们必须提供新构造函数同时修改旧构造函数。...一、第二次优化 上述代码基本上囊括了大部分情况,但有时我们还会遇到一些集合实现了 ICollection 没有实现 IList 情况,这种情况下我们代码中 GetEnumerator 方法性能就不是很高了...,但是我们还需要注意是前面代码中 DemoEnumerable 都是执行运行期测试,测试是参数在运行期状态,因此为了确定参数所表示对象是否具有一些功能,我们程序必须消耗一定时间去判断,在绝大多数情况下这种做法消耗性能不是很多

    60810

    Java list foreach_javaforeach

    Java容器中,所有的Collection子类(List、Set)会实现Iteratable接口以实现foreach功能。...forEach()方法里面有个Consumer类型,它是Java8新增一个消费型函数式接口,其中accept(T t)方法代表了接受一个输入参数并且无返回操作。...小结: foreach相对于for循环,代码减少了,但是foreach依赖IEnumerable(IEnumerable是一个接口,它定义一个方法GetEnumerator,它返回一个IEnumerator...接口,这允许只读访问一个集合,然后实现IEnumerable集合可以与for-each语句一起使用)。...可以说,foreach语句是for语句特殊简化版本,在遍历数组、集合方面,foreach为开发人员提供了极大方便。在复杂循环设计时,还是应该使用for循环更加灵活。

    1.6K20

    C#规范整理·集合和Linq

    一旦确实需要新迭代需求,完全可以创建一个新迭代器来满足需求,不是为集合设置该迭代器,因为这样做会直接导致使用到该集合对象其他迭代场景发生不可知行为。 现在,我们有了LINQ。...如果将属性设置为可写,则会增加抛出异常几率。一般情况下,如果集合属性没有值,则它返回Count等于0,不是集合属性值为null。...稍加观察我们会发现,接口IQueryable<T>实际也是继承了IEnumerable<T>接口,所以,致使这两个接口方法在很大程度上是一致。那么,微软为什么要设计出两套扩展方法呢?...LINQ to SQL引擎最终会将表达式树转化成为相应SQL语句,然后在数据库中执行。 那么,到底什么时候使用IQueryable<T>,什么时候使用IEnumerable<T>呢?...借助于LINQ强大功能,我们通过两条语句就能实现上述排序要求。

    19030

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

    很多时候我们在编写应用框架时候,都会自己去实现IEnumerble对象,一般不会用系统提供集合类,这样为了框架OO性,上下文连贯性,更模型化。如果应用框架具备一定查询能力是不是很方便些。...LINQ查询Object是基于IEnumerable对象不是集合对象有什么好查。...如果我们是直接使用系统提供IEnumerable对象的话,只需要构建IEnumerable对象扩展方法就能实现对集合类型扩展。...所以要注意本次调用将是接着上一次调用,不是以个新开始。理解这一点对后面的LINQ分析很关键。 ?...通过上图中,我们大概能分析出IQueryable对象是每次方法调用都会产生一个新实例,这个实例接着被下一个方法自然接受,依次调用。

    1.4K11

    框架设计原则和规范(四)

    实现了这两个接口之一任何类型,除非是作为GetEnumerator方法返回类型 如果你不用GetEnumerator方法来返回枚举器(enumerator),那么这个类就无法用在foreach语句中...a) 不要让属性返回快照集合,属性应该返回实况集合 b) 要用快照集合或实况IEnumerable(或其子类)来表示不稳定集合 8) 数组与集合之间选择 A.优先使用集合,不是优先使用数组...9) 自定义集合实现 A.要在设计新集合时实现IEnumerable B....自定义集合命名 a) 如果实现了IDictionary接口要添加""Dictionary""后缀 b) 如果实现IEnumerable,并且类型表示是一个元素列表,要添加“Collection”后缀...考虑为了支持老版本双向转换实现IExtensibleDataObject 4) 对XML序列化支持 参见: 考虑让类型支持XML序列化,或同时支持数据协定序列化和XML序列化——如果需要在序列化类型是对生成

    1.5K40

    C Sharp(十三)

    之前我们说过可以使用 foreach 来遍历数组元素,本篇来讨论为什么数组可以使用 foreach 语句处理,我们可以还使用迭代器来使得自定义类型也可以使用 foreach。...枚举器和可枚举类型 为什么数组可以使用 foreach 呢?因为数组可以提供一个枚举器(enumerator)对象。枚举器对象可以依次返回数组元素。...获取一个对象枚举器可以调用对象 GetEnumerator 方法。实现了 GetEnumerator 方法对象称为可枚举(enumerable)对象。...foreach 语句就是用来配合可枚举类型一起使用,他会执行下列行为: 调用 GetEnumerator 方法获取对象枚举器 从枚举器请求每一项作为迭代变量(iteration variable)...泛型与非泛型版本主要区别是: IEnumerable 接口 GetEnumerator 方法要返回实现 IEnumerator 接口枚举器实例 泛型版本 Current 属性返回不是 object

    58920

    .NET面试题系列 - LINQ:性能

    你确定你会遍历整个序列多于一次时候 如果序列不是很大时候(因为ToList / ToArray / ToDictionary等方法将会在堆上分配一个序列对象) 是否返回IEnumerable...所以在使用ORM时,如果它用到了IQueryable,请将你查询也写成表达式不是委托形式。...参考:http://www.cnblogs.com/SieAppler/p/3501475.html 另外,我们可以通过返回IEnumerable不是List或数组,来给予呼叫者最大便利。...获得你需要列(使用ViewModel或者改进你查询)和行(使用IQueryable) 尽可能使用一条查询不是多条 只为了展示数据,不进行后续修改时,可以使用AsNoTracking。...避免过早ToList,返回IEnumerable/ IQueryable类型巨大规模数据。 是否需要重复极其多次运行相同LINQ语句?考虑使用foreach或者PLINQ来优化性能。

    2.6K40

    C# 常用接口学习 IEnumerable

    2、继承接口IEnumerable: 当我们在类后面加上:IEnumerable后,Visual Studio IDE会冒出来一个小黄灯泡,点进去有提示自动填充接口约定,我们选第一项实现接口(Visaul...设置成-1不是0是因为迭代器首先调用MoveNext,在MoveNext里面我们先把索引+1指向下一个元素,如果索引_index值初始为0,则第一个元素是元素集[1],第二个元素了。...我们实现了可枚举自己类。...通过观察,发现迭代器主要就是返回一个元素对象StudentColletion里面的students元素集是List,本身就能枚举,我们能不能利用这个不用专门写迭代器来实现枚举呢?...二、接口IEnumerable实现 如果我们想写一个通用foreach类,用到泛型: class MyCollection { public List<

    77730
    领券