C# 迭代器与yield关键字

yield关键字在迭代器中,用于向枚举对象返回元素值或发出迭代结束信号。

迭代器能够在类或结构中支持foreach迭代,而不必实现IEnumerable接口。

创建迭代器最常用的方法是对IEnumerable接口实现GetEnumerator方法。

using System;
using System.Collections;
using System.Collections.Generic;

namespace DemoIterator1
{
    /// <summary>
    /// 包含迭代器的自定义集合类
    /// </summary>
    public class MyDocuments : IEnumerable
    {
        private List<string> docs = new List<string>();

        public void Add(string s)
        {
            docs.Add(s);
        }

        #region IEnumerable 成员

        public IEnumerator GetEnumerator()
        {
            foreach (string s in docs)
            {
                yield return s;
            }

        }

        #endregion/**/
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("从包含自定义迭代器的集合类中枚举元素\n");
            //初始化自定义集合
            MyDocuments document = new MyDocuments();
            document.Add("依莲");
            document.Add("玉珈");
            document.Add("徐长今");
            document.Add("宁雨昔");
            document.Add("安碧如");
            document.Add("洛凝");
            document.Add("萧玉若");

            //通过带有自定义迭代器的类枚举元素
            foreach (string s in document)
                Console.Write(string.Format(" {0} ", s));

            Console.WriteLine("\n**********************************************\n");
            Console.WriteLine("从自定义迭代器方法中枚举元素\n");

            List<string> docs = new List<string>();
            docs.Add("依莲");
            docs.Add("玉珈");
            docs.Add("徐长今");
            docs.Add("宁雨昔");
            docs.Add("安碧如");
            docs.Add("洛凝");
            docs.Add("萧玉若");

            //通过自定义迭代器方法中枚举元素
            foreach (string s in Documents(docs))
                Console.Write(string.Format(" {0} ",s));

            Console.ReadKey();
        }

        /// <summary>
        /// 迭代器方法
        /// </summary>
        static IEnumerable Documents(List<string> docs)
        {
            foreach (string s in docs)
            {
                yield return s;
            }
        }

    }
}

注:本文代码来自《LINQ入门及应用》!!!

posted on 2012-08-02 15:12  YuanSong  阅读(1241)  评论(0编辑  收藏  举报

导航