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

C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能

原因是C#中自定义集合类型要实现foreach的功能,必须通过IEnumerator和IEnumerable两个接口来实现!...2、通过IEnumerator和IEnumerable两个接口实现自定义集合类型的foreach循环功能....第一步:实现自定义集合类型实现IEnumerable接口,实现该接口的字面意思可以理解为:自定义集合类型实现了该接口,就拥有了"可枚举的功能".代码如下: ?...第五步:分析原理 总结分析下上面的代码,实现foreach代码的基本原理如下: 1、编写自定义集合类,实现IEnumerable接口,通过GetEnumerator()方法返回一个迭代对象实例. 2、...Important 3、将初始化完的类数组作为参数传递给迭代类 4、编写迭代类,create 构造函数,接收自定义集合类初始化完的类数组 5、实现IEnumerator(迭代)接口,实现对应的三个方法

895100

C Sharp(十三)

之前我们说过可以使用 foreach 来遍历数组元素,本篇来讨论为什么数组可以使用 foreach 语句处理,我们可以还使用迭代来使得自定义类型也可以使用 foreach。...枚举和可枚举类型 为什么数组可以使用 foreach 呢?因为数组可以提供一个枚举(enumerator)对象。枚举对象可以依次返回数组元素。...foreach 语句就是用来配合可枚举类型一起使用的,他会执行下列行为: 调用 GetEnumerator 方法获取对象的枚举 枚举请求每一项作为迭代变量(iteration variable)...current = (int)ie.Current; Console.WriteLine(current); } } } IEnumerable枚举类型是指实现了...IEnumerable 只有一个函数成员: GetEnumerator: 获取可枚举类型的枚举 using System.Collections; class MyClass : IEnumerable

55120
您找到你想要的搜索结果了吗?
是的
没有找到

浅谈泛型

另外假如泛型类型定义了静态构造,那么针对每一个封闭类型,都会执行一次。泛型类型定义静态构造的目的是保证传递的类型实参满足特定的条件。...例如,由于ListObject派生,所以List和List也Object派生。指定类型实参不影响继承层次结构。...泛型的验证和约束 前面我们提到,使用静态构造来约束泛型,我们可以这样定义只能处理枚举类型的泛型类型: class GenericTypeThatRequireAnEnum { static...构造约束 主要约束 为类型参数指定一个引用类型约束。相当于向编译承诺:一个指定的类型实参要么是约束类型相同的类型,要么是约束类型派生的类型。...包括枚举在内的任何值类型都满足这个约束,但是Nullable值类型除外,编译和CLR认为它是特殊类型。

1K30

C# yeild

在编程语言中,迭代是一种可以遍历容器(如列表或数组)的元素的对象。在C#中,我们可以使用yield关键字创建自定义的迭代。...yield是一个强大的关键字,它使我们能够使用简洁、清晰的语法来创建和管理迭代。 什么是Yield? 在C#中,yield关键word用于指定一个迭代块,也就是提供可枚举接口实现的方法。...Yield的使用方法 让我们通过一个例子来看看如何使用yield: public static IEnumerable GetNumbers() { for (int i = 0; i...让我们看一个例子: public static IEnumerable GetNumbers() { for (int i = 0; i < 10; i++) {...例如,下面这个函数可生成一个无限的整数序列: public static IEnumerable GenerateInfiniteSequence() { int i = 0;

12110

C#3.0新增功能09 LINQ 标准查询运算符 04 运算

作为参数传递 SelectMany() 的转换函数必须为每个源值返回一个可枚举值序列。 然后,SelectMany() 串联这些可枚举序列,以创建一个大的序列。...在每种情况下,假定选择(转换)函数每个源值中选择一个由花卉数据组成的数组。 下图描述 Select() 如何返回一个与源集合具有相同元素数目的集合。 ?...List numbers = new List() { 35, 44, 200, 84, 3987, 4, 199, 329, 446, 208 }; IEnumerable...本表中名称以“As”开头的转换方法可更改源集合的静态类型,但不对其进行枚举。 名称以“To”开头的方法可枚举源集合,并将项放入相应的集合类型。...方法 方法名 说明 C# 查询表达式语法 详细信息 聚合 对集合的值执行自定义聚合运算。 不适用。

9.6K20

yield关键字看IEnumerable和Collection的区别

后记 一、一个很简单的例子 下面是一个很简单的例子:Vector为自定义表示二维向量的类型,Program的静态方法GetVetors方法获取以类型为IEnumerable...针对上面这个例子,我们对其进行简单的修改来验证“延迟赋值”的存在。...从中我们清楚地但,对Vector对象的创建发生在每一个迭代中。...IEnumerable这个接口和集合没有本质的联系,只是提供“枚举”的功能。甚至说,我们应该将IEnumerable对象当成“只读”的,如果我们需要“可写”的功能,你应该使用数组或者集合类型。...至于本文提到的“延迟赋值”或者“延迟计算”,如果就“枚举”功能而言,也不是很准确,因为“枚举”不承诺“赋值”。

75280

迭代模式

迭代模式的优点 1.访问一个聚合对象的内容而无须暴露它的内部表示。 2.遍历任务交由迭代完成,这简化了集合类。 3.它支持以不同方式遍历一个聚合,甚至可以自定义迭代的子类以支持新的遍历。...一个集合可以有多个“书签”,移动其中任何一个都可以枚举集合,与其他枚举互不影响。...可在实现自定义集合类型迭代模式时无需其他显式类,使用yield return语句可一次返回一个元素。...迭代方法运行yield return语句时,会返回一个expression,并保留当前在代码中的位置。下次调用迭代函数时,将从该位置重新开始执行。...迭代执行过程 以下代码迭代方法返回IEnumerable,然后遍历其元素。

62630

LINQ查询操作符 LINQ学习第二篇

以下的示例演示了如何创建一个IEnumerable类型的空集合: var q = Enumerable.Empty(); Console.WriteLine(q == null...下面的示例演示了使用Range操作符来生成09的整数序列: var q =     Enumerable.Range(0, 10); foreach (var item in q) {...名称以“As”开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合。名称以“To”开头的方法可枚举(即时加载)源集合并将项放入相应的集合类型。 1....ToDictionary ToDictionary操作符根据指定的键选择函数,IEnumerable创建一个Dictionary。...它也可以像First方法一样传递一个条件。需要说明的是如果序列中不包含任何元素,返回的默认值是个怎样的元素。

3.1K50

.NET面试基础知识

例如,可以程序集a或程序集b中的所有类访问ClassA的PublicF。 类型和类型成员的访问修饰符, 类型(类、结构、枚举、接口、委托等)只能有内部和公共访问修饰符。...IEnumerable vs. IEnumerator 这些都是向前使用的,并且只读取一个集合的访问权限。 ? IEnumerable使用IEnumerator,它可以与foreach语句一起使用。...IEnumerable内存集合中查询数据(比如,列表) 它在内存中加载数据(服务客户端),同时数据库查询数据,然后过滤客户端数据。 不支持自定义查询。 不支持延迟加载。...IQueryable 可以内存之外查询数据(服务端类、远程数据库、web服务) 它在数据库查询时过滤服务端的数据,然后发送到客户端。...valueA = 5; int inputAndOutputValueB = 6; int inputOnlyValueC = 7; int outputOnlyValueD;

81820

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

IEnumerator接口定义对类中的集合类型对象的迭代方式, IEnumerable接口允许使用foreach循环进行枚举。...“英文词根上讲: IEnumerator接口代表了枚举,里面定义了枚举方式,是名词。 IEnumerable接口代表该对象具备了可被枚举的性质,是形容词。...总之,如果您想提供对foreach的支持,那么就先让对象可枚举,再谈论枚举方式,也就是说实现这两个接口。 最佳实践 在嵌套类中实现IEnumerator,这样你可以创建多个枚举。...private class MyEnumerator:IEnumerator { public car[] carlist; int...cars, 实际会访问cars实现的 GetEnumerator()方法,拿到迭代 foreach每次迭代,实际会访问迭代的Current属性

2.5K20

Python3 与 C# 扩展之~基础衍生

IEnumerator 和 IEnumerable 通俗话讲: 能不能 foreach就看你遍历对象有没有实现 IEnumerable,就说明你是不是一个 可枚举类型( enumerator type)...public interface IEnumerable{ IEnumerator GetEnumerator();} 是不是个枚举( enumerator)就看你实现了 IEnumerator...(yield官方文档) 其实迭代(iterator)就是为了更简单的创建枚举(enumerator)和可枚举类型(enumerator type)的方式 如果枚举和可枚举类型还是不理解(举个例子)...就懂了:(遍历方式就看出区别了) 定义一个斐波拉契函数,返回可枚举类型 /// /// 返回一个可枚举类型/// public static IEnumerable.../// /// 返回一个枚举/// public static IEnumerator FibonaByIEnumerator(int n){

1.7K70
领券