博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
参考MSDN学习《迭代器》
阅读量:6614 次
发布时间:2019-06-24

本文共 2003 字,大约阅读时间需要 6 分钟。

 

迭代器是一种方法、get 访问器或运算符,它通过使用 yield 关键字对数组或集合类执行自定义迭代。yield 返回语句会导致源序列中的元素在访问源序列中的下一个元素之前立即返回给调用方。尽管您以方法的形式编写迭代器,但编译器会将其转换为一个实际上是状态机的嵌套类。只要客户端代码中的 foreach 循环继续进行,此类就会跟踪迭代器的位置。


 

将使用 foreach 语句从客户端代码中调用迭代器。在为类或结构创建迭代器时,您不必实现整个 IEnumerator 接口。当编译器检测到迭代器时,它将自动生成 IEnumerator 或 IEnumerator<(Of <(T>)>) 接口的 Current、MoveNext 和 Dispose 方法。


 

迭代器是可以返回相同类型的值的有序序列的一段代码

迭代器可用作方法、运算符或 get 访问器的代码体。

迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。

可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,如下所示:foreach(int x in SampleClass.Iterator2){}。迭代器的返回类型必须为 IEnumerable、IEnumerator、IEnumerable<(Of <(T>)>) 或 IEnumerator<(Of <(T>)>)。

迭代器是 LINQ 查询中延迟执行行为的基础。
yield 关键字用于指定返回的一个或多个值。到达 yield return 语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。

迭代器对集合类特别有用,它提供一种简单的方法来迭代复杂的数据结构(如二进制树)。


下面举两个自定义集合类中,迭代器的使用,可以大大减少代码的使用量。 

 

 
using System;
using System.Collections;
namespace Yield
{
    class Week : IEnumerable
    {
        string[] Days = {
"星期1", "星期2", "星期3", "星期4", "星期5", "星期6", "星期7" };
        public IEnumerator GetEnumerator()
        {
            for (int i = 0; i < Days.Length; ++i)
            {
                yield return Days[i];
            }
        }
    }
    class Test
    {
        static void Main()
        {
            Week week = new Week();
            foreach (string day in week)
            {
                Console.WriteLine(day);
            }
            Console.ReadKey();
        }
    }
}

 
重新使用迭代器实现前面的自定义的Library(集合)类

using
System.Collections;
using
System;
namespace
Library
{
   
class
Library
:
IEnumerable
   
{
       
ArrayList
books;
       
public
Library()
       
{
           
books
=
new
ArrayList();
       
}
       
public
void
Remove(
string
book)
       
{
           
books
.
Remove(
book);
       
}
       
public
void
Add(
string
book)
       
{
           
books
.
Add(
book);
       
}
       
public
IEnumerator
GetEnumerator()
       
{
         
// for (int i = 0; i < books.Count; i++)
         
//{
         
//    yield return books[i];
         
// }
           
foreach (
string
book
in
books)
           
{
               
yield
return
book;
           
}
       
}
   
}
   
class
Test
   
{
       
static
void
Main()
       
{
           
Library
lib
=
new
Library();
           
lib
.
Add(
"《广告》");
           
lib
.
Add(
"《传播学》");
           
lib
.
Add(
"《传媒研究》");
           
lib
.
Add(
"《市场调研》");
           
Console
.
WriteLine(
"说含有的课本包括:");
           
foreach (
string
name
in
lib)
           
{
               
Console
.
WriteLine(
name);
           
}
           
Console
.
ReadKey();
       
}
   
}
}

转载于:https://www.cnblogs.com/rohelm/archive/2011/11/13/2384095.html

你可能感兴趣的文章
在VirtualBox中的CentOS 6.3下安装VirtualBox增强包(GuestAd...
查看>>
Java开发中的23种设计模式详解(转)
查看>>
我的友情链接
查看>>
组策略18招
查看>>
关于Android中的数据存储
查看>>
Tomcat配置日志生产功能
查看>>
js的自执行函数
查看>>
移植Qt与Tslib到X210开发板的体会
查看>>
Nginx + webpy 和FastCGI搭建webpy环境
查看>>
new static 跟 new self 区别
查看>>
PLSQL Develope连接oracle数据库配置
查看>>
使用JdbcTemplate过程中使用到多个参数和like模糊
查看>>
解决eclipse中无法删除Tomcat服务器中的项目,报maven is required and cannot be removed from the server错误情况...
查看>>
修改页面JS 360浏览器
查看>>
尚学linux课程---3、linux网络说明
查看>>
Git 跟 GitHub 是什么关系?
查看>>
String.split()方法
查看>>
IE6下jQuery选中select的BUG
查看>>
Tensorflow在win10下的安装(CPU版本)
查看>>
嵌入式平台做深度学习算法,不可不重视的4件事
查看>>