实现自定义集合的可枚举类型(IEnumerable)和枚举数(IEnumerator )

下面的代码示例演示如何实现自定义集合的 IEnumerable 和 IEnumerator 接口:

  1 using System;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4 using System.Linq;
  5 using System.Text;
  6 using System.Threading.Tasks;
  7
  8 namespace ConsoleApplication1
  9 {
 10     public class Person
 11     {
 12         public Person(string fName, string lName)
 13         {
 14             this.firstName = fName;
 15             this.lastName = lName;
 16         }
 17
 18         public string firstName;
 19         public string lastName;
 20     }
 21
 22     public class People : IEnumerable
 23     {
 24         private Person[] _people;
 25         public People(Person[] pArray)
 26         {
 27             _people = new Person[pArray.Length];
 28
 29             for (int i = 0; i < pArray.Length; i++)
 30             {
 31                 _people[i] = pArray[i];
 32             }
 33         }
 34
 35         IEnumerator IEnumerable.GetEnumerator()
 36         {
 37             return (IEnumerator)GetEnumerator();
 38         }
 39
 40         public PeopleEnum GetEnumerator()
 41         {
 42             return new PeopleEnum(_people);
 43         }
 44     }
 45
 46     public class PeopleEnum : IEnumerator
 47     {
 48         public Person[] _people;
 49
 50         // Enumerators are positioned before the first element
 51         // until the first MoveNext() call.
 52         int position = -1;
 53
 54         public PeopleEnum(Person[] list)
 55         {
 56             _people = list;
 57         }
 58
 59         public bool MoveNext()
 60         {
 61             position++;
 62             return (position < _people.Length);
 63         }
 64
 65         public void Reset()
 66         {
 67             position = -1;
 68         }
 69
 70         object IEnumerator.Current
 71         {
 72             get
 73             {
 74                 return Current;
 75             }
 76         }
 77
 78         public Person Current
 79         {
 80             get
 81             {
 82                 try
 83                 {
 84                     return _people[position];
 85                 }
 86                 catch (IndexOutOfRangeException)
 87                 {
 88                     throw new InvalidOperationException();
 89                 }
 90             }
 91         }
 92     }
 93
 94
 95     class Program
 96     {
 97         static void Main(string[] args)
 98         {
 99             Person[] peopleArray = new Person[3]
100             {
101                 new Person("John", "Smith"),
102                 new Person("Jim", "Johnson"),
103                 new Person("Sue", "Rabon"),
104             };
105
106             People peopleList = new People(peopleArray);
107             foreach (Person p in peopleList)
108                 Console.WriteLine(p.firstName + " " + p.lastName);
109         }
110     }
111 }

可枚举类型 → 实现IEnumerable接口,可以不需要直接实现这个接口,但必须有个GetEnumerator方法,返回值类型必须为IEnumerator类型,也就是第四点最后一段代码中接口注释的那种写法!

枚举数 → 实现IEnumerator接口,实现全部方法,首先是调用GetEnumerator返回一个类型为IEnumerator的枚举数,然后编译器会隐式的调用实现IEnumerator类中的方法和属性!

总结:所以实现foreach遍历,必须达到上面的两种条件才能进行遍历对象,他们可以写在一起也可以分开,最好是分开,进行职责分离,一个类干一件事总归是好事!也满足面向对象的单一指责设计原则。

原文地址:https://www.cnblogs.com/jshchg/p/11572039.html

时间: 2024-10-05 23:56:23

实现自定义集合的可枚举类型(IEnumerable)和枚举数(IEnumerator )的相关文章

C#语言基础——结构体和枚举类型

结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承. 用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等.这可以节省内存,因为没有如类对象所需的那样有额外的引用产生.例如,当声明含有成千上万个对象的数组时,这会引起极大的差异. 结构体是一个变量组,将一组变量放在一起,

C#的枚举数(Enumerator)和可枚举类型(Enumerable)

数组可以被foreach语句遍历数组中的元素,原因是数组可以按需提供一个叫做枚举数(enumerator)的对象.枚举数可以依次返回请求的数组的元素. 对于有枚举数的类型而言,必须有一个方法来获取它们.在.NET中获取一个对象枚举数的标准用法是调用对象的GetEnumerator方法.实现GetEnumerator方法的类型叫做可枚举类型(enumerable),数组就是可枚举类型. 要注意枚举数(enumerator)和可枚举类型(enumerable)的区别和联系. 枚举数是可以依次返回集合

C#枚举类型和结构体

注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianling; public int fenshu; public string name; public string sex; public int sum; } 以上的语句就是定义一个名称为student的结构体,其中包含int类型的年龄.分数.总和,和string类型的姓名.性别. 二.用法: 在

结构体,枚举类型

结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianling; public int fenshu; public string name; public string sex; public int sum; } 以上的语句就是定义一个名称为student的结构体,其中包含int类型的年龄.分数.总和,和string类型的姓名.性别. 二.用法: 在main主函数外面定义了一个名称为st

结构体与枚举类型

结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianling; public int fenshu; public string name; public string sex; public int sum; } 以上的语句就是定义一个名称为student的结构体,其中包含int类型的年龄.分数.总和,和string类型的姓名.性别. 二.用法: 在main主函数外面定义了一个名称为st

【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-import.html#1.2.values方法的使用: Java基础笔记 – 枚举类型的使用介绍和静态导入 本文由arthinking发表于4年前 | Java基础 | 暂无评论 |  被围观 8,332 views+ 1.枚举(Enum):1.1.枚举类型中的两个静态方法:1.2.values方法的使用:

2016.8.3 C#基础 结构体,枚举类型

结构体-枚举类型 一.枚举类型 枚举(enum)是值类型的一种特殊形式,它从System.Enum继承而来,并为基础类型的值提供替代名称.枚举类型有名称.基础类型和一组字段.基础类型必须是一个除char 类型外的内置的有符号(或无符号)整数类型(如Byte.Int32或UInt64).也可以说,枚举类型是一组常量的集合. 1.定义:Enum....{E} 枚举元素的默认基础类型为int.默认情况下,第一个枚举数的值为0,后面每个枚举数的值依次递增1.例如: enum meiju://枚举是常量的

Effective Java 第三版——34. 使用枚举类型替代整型常量

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. Java支持两种引用类型的特殊用途的系列:一种称为枚举类型的类和一种称为注解类型的接口. 本章讨论使用这些类型系列的最佳实践. 34. 使用枚举类型替代整型常量 枚举是其合

Java魔法堂:枚举类型详解

一.前言 Java的枚举类型相对C#来说具有更灵活可配置性,Java的枚举类型可以携带更多的信息. // C# enum MyColor{ RED = 0, BLUE = 1 } Console.Write(MyColor.RED); // Java enum MyColor{ RED("Hot", 4), BLUE("SAD",8); private String mood; public String getMood{ return mood; } privat

枚举类型enum

枚举类型的定义 枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合. 定义格式:枚举类型的定义格式为:    enum <类型名> {<枚举常量表>};其中: 关键字enum——指明其后的标识符是一个枚举类型的名字. 枚举常量表——由枚举常量构成.“枚举常量”或称“枚举成员”,是以标识符形式表示的整型量,表示枚举类型的取值.枚举常量表列出枚举类型的所有取值,各枚举常量之间以“,”间隔,且必须各不相同.取值类型与条件表达式相同. 应用举