C# 迭代器的使用例子

一、使用数组做迭代,foreach (Person p in people.Persons),如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IEnumerableTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Person[] persons = new Person[4]
            {
                new Person("John","Smith", 18, true),
                new Person("Kite", "Green", 16, false),
                new Person("Lei", "Li", 17, true),
                new Person("Meimei", "Han", 15, false)
            };
            People people = new People(persons);
            foreach (Person p in people.Persons)
            {
                Console.WriteLine(p.ToString());
            }
        }
    }

    public class People
    {
        private Person[] _persons;
        public Person[] Persons
        {
            get { return _persons; }
            set { _persons = value; }
        }

        public People(Person[] persons)
        {
            this.Persons = persons;
        }
    }

    public class Person
    {
        public Person(string firstName, string lastName, int age, bool gender)
        {
            this.FirstName = firstName;
            this.LastName = lastName;
            this.Age = age;
            this.Gender = gender;
        }

        private string _firstName;
        public string FirstName
        {
            get { return _firstName; }
            set { _firstName = value; }
        }

        private string _lastName;
        public string LastName
        {
            get { return _lastName; }
            set { _lastName = value; }
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        private bool _gender;
        public bool Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        public override string ToString()
        {
            string gender = string.Empty;
            if (this.Gender)
                gender = "male";
            else
                gender = "female";
            return string.Format("{0} {1}, {2}, is {3} years old.", this.FirstName, this.LastName, gender, this.Age);
        }
    }
}

二、由于一些必要的原因,不希望在类的外面直接操作people.Persons,则对类People改造如下:

    public class People
    {
        private Person[] _persons;
        public People(Person[] persons)
        {
            this._persons = new Person[persons.Length];
            for (int i = 0; i < persons.Length; i++)
            {
                _persons[i] = persons[i];
            }
        }
    }

此时,对people.Persons进行遍历是不可能的。可是,我们仍然有对Persons进行遍历的需求。

怎么办?继续改造类People,让我们可以直接对类People进行遍历:foreach (Person p in people)

怎么改造?添加迭代器。

三、添加迭代器

1.继承IEnumerable

2.添加方法

IEnumerator IEnumerable.GetEnumerator()
    {
       ...
    }

如下:

    public class People : IEnumerable
    {
        private Person[] _persons;
        public People(Person[] persons)
        {
            this._persons = new Person[persons.Length];
            for (int i = 0; i < persons.Length; i++)
            {
                _persons[i] = persons[i];
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            //...
        }
    }

时间: 2024-08-03 22:38:27

C# 迭代器的使用例子的相关文章

Python高级特性:迭代器和生成器 -转

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了. 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身:next()方法返回容器的下一个元素,在结尾时引发StopIteration异常. __iter__()和next()

python基础:迭代器、生成器(yield)详细解读

1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代器的优点 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值).但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式. 另外,迭代器的一大优点是不要求事

Python 生成器&迭代器

Python 生成器 带有 yield 的函数在 Python 中被称之为 generator(生成器),用斐波那契数列: def fab(max):     n, a, b = 0, 0, 1     while n < max:         yield b         a, b = b, a + b         n = n + 1 执行: 1 2 3 4 5 6 7 8 9 >>> for n in fab(5):     print n 1 1 2 3 5 简单地

python中的生成器和迭代器

1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代器的优点 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值).但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式. 另外,迭代器的一大优点是不要求事

.NET基础之迭代器

使用foreach循环是有IEnumerator接口来实现的,IEnumerator即实现了迭代器,在foreach中如何迭代一个集合arrayList呢? 调用arrayLis.GetEnumberator(),返回一个IEnumberator引用. 调用所返回的Enumberator接口的MoveNext()方法. 如果MoveNext()返回true,就使用IEnumberator接口的Current属性获取对象的一个引用,用于foreach循环. 重复前面两步,知道MoveNext方法返

python 迭代器 生成器 (转)

转帖: 原文写的不错! 原文地址:http://www.cnblogs.com/kaituorensheng/p/3826911.html#_label0 阅读目录 1. 迭代器 2. 生成器 3. 参考 回到顶部 1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代器的优点 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典fo

设计模式(9.1)--迭代器与组合模式

缓存(caching): 当组合结构很复杂,或者遍历的代价太高,那么实现组合节点的缓存就很有帮助. (1) Java Collection Framework 指的是一群类的接口. 其中包括了 ArrayList, Vector , LinkedList , Stack ,和 PriorityQueue. 这些类都实现了java.util.Collection接口. (2) Collection接口中的一些方法: add()  , addAll()  , clear() , contains()

迭代器 生成器

1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代器的优点 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值).但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式. 另外,迭代器的一大优点是不要求事

装饰器,迭代器,生成器

一.装饰器 无参装饰器: 1.示例1: 1 import time #加载时间模块 2 def war(name): #定义装饰器 3 def wari(): 4 start = time.time() #定义开始时间 5 name() #相当于执行下面的函数 6 stop = time.time() #定义结束时间 7 print("run time is %s" %(stop-start)) #给原来函数加入的新功能 8 return wari 9 @war 10 def info