GetEnumerator();yield

GetEnumerator()方法的实质实现:

说明:只要一个集合点出GetEnumerator方法,就获得了迭代器属性,就可以用MoveNext和Current来实现foreach的效果,如上图。

在.NET中,迭代器模式被IEnumerator和IEnumerable及其对应的泛型接口所封装。如果一个类实现了IEnumerable接口,那么就能够被迭代;调用GetEnumerator方法将返回IEnumerator接口的实现,它就是迭代器本身。

所以一般能用foreach实现的,都可以让集合点出GetEnumerator( ),即得到迭代器,就可以用:

while(ooo.MoveNext())

{

var  = ooo.Current;

}//其实foreach后台实现机制如此!

*****************************************************************************

两个方法效果一样

********************************************************************************

yield关键字用法:

yield一般和迭代器,return或者break关键字结合使用一起使用。

例如:

 1 publicclass List
 2 {
 3     public static IEnumerable Power(int number(2), int exponent(8))//使用yield return 使得返回值是一个迭代器类型
 4     {
 5         int counter =0;
 6         int result =1;
 7         while (counter++< exponent)
 8         {
 9             result = result * number;
10             yield return result;
11         }
12     }
13
14 staticvoid Main()
15     {
16         foreach (int i in Power(2, 8))
17         {
18             Console.Write("{0} ", i);
19         }
20     }
21 }
/*输出:
Output:
2 4 8 16 32 64 128 256       //
*/

了解枚举的机制后,就不得不讲道yield:

 1  class Program
 2  {
 3  staticvoid Main(string[] args)
 4      {
 5  foreach (var item in Person.Run())
 6          {
 7              Console.WriteLine(item);
 8          }
 9      }
10 }
11 class Person
12 {
13 public static IEnumerable<int> Run()
14     {
15          List<int> list = new List<int>();
16 foreach (var item in list)
17         {
18 yieldreturn item;
19         }
20    }
21  }

//yield会给你生成一个枚举类,而这个枚举类和刚才List中的Enumerator枚举类又无比的一样

yield关键字用法:

yield一般和迭代器,return或者break关键字结合使用一起使用。

例如:

publicclass List
{
    public static IEnumerable Power(int number(2), int exponent(8))//使用yield return 使得返回值是一个迭代器类型
    {
        int counter =0;
        int result =1;
        while (counter++< exponent)
        {
            result = result * number;
            yield return result;
        }

}

staticvoid Main()
    {
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }
}
/*
Output:
2 4 8 16 32 64 128 256       //
*/

时间: 2025-01-03 19:04:22

GetEnumerator();yield的相关文章

C#基础复习IEnumerable(和 yield return的使用滴呀 )

IEnumerable 真是基础中的基础,然而..... 我们直接来看看这个接口的实现吧: 它是一个公开枚举数,该枚举数支持在非泛型集合上进行简单的迭代.换句话说,对于所有数组的遍历,都来自IEnumerable,那么我们就可以利用这个特性,来定义一个能够遍历xxxxxx的通用方法 先看我们的经典实例1: using System; using System.Collections; using System.Collections.Generic; using System.Linq; usi

C#-foreach与yield

(转自:http://www.jb51.net/article/34627.htm) 1. foreach语句 C#编译器会把foreach语句转换为IEnumerable接口的方法和属性. ? 1 2 3 4 foreach (Person p in persons) {     Console.WriteLine(p); } foreach语句会解析为下面的代码段. ?调用GetEnumerator()方法,获得数组的一个枚举?在while循环中,只要MoveNext()返回true,就一直

C#中的foreach和yield

1. foreach C#编译器会把foreach语句转换为IEnumerable接口的方法和属性. foreach (Person p in persons) { Console.WriteLine(p); } foreach语句会解析为下面的代码段. 调用GetEnumerator()方法,获得数组的一个枚举 在while循环中,只要MoveNext()返回true,就一直循环下去 用Current属性访问数组中的元素 IEnumerator enumerator = persons. Ge

利用 Python yield 创建协程将异步编程同步化

在 Lua 和 Python 等脚本语言中,经常提到一个概念: 协程.也经常会有同学对协程的概念及其作用比较疑惑,本文今天就来探讨下协程的前世今生. 首先回答一个大家最关心的问题:协程的好处是什么? 通俗易懂的回答: 让原来要使用 异步 + 回调 方式写的非人类代码,可以用看似同步的方式写出来. 1.回顾同步与异步编程 同步编程即线性化编程,代码按照既定顺序执行,上一条语句执行完才会执行下一条,否则就一直等在那里. 但是许多实际操作都是CPU 密集型任务和 IO 密集型任务,比如网络请求,此时不

线程中sleep(),join(),yield()的使用

线程Thread中有3个方法 sleep(int mills)的作用是使线程睡眠mills个毫秒: join()的作用是合并线程,使两个线程合并到一条线上运行: yield()的作用是暂时让出CPU给其他线程运行. 优先级的设置: Thread.MAX_PRIORITY; Thread.MIN_PRIORITY; Thread.NORM_PRIORITY; 同样的线程对象可以起两个线程:

Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别

从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield. 或者当前正在被服务的线程需要睡一会,醒来后继续被服务,这就是sleep. sleep方法不推荐使用,可用wait. 线程退出最好自己实现,在运行状态中一直检验一个状态,如果这个状态为真,就一直运行,如果外界更改了这个状态变量,那么线程就停止运行. sleep(

Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别

Java线程中sleep().wait()和notify()和notifyAll().suspend和resume().yield().join().interrupt()的用法和区别 从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield. 或者当前正在被服务的线程需要睡一会,醒来后继续被服务,这就是sleep. 

Java中线程的yield(),sleep()以及wait()的区别

从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield.或者当前正在被服务的线程需要睡一会,醒来后继续被服务,这就是sleep. sleep方法不推荐使用,可用wait.线程退出最好自己实现,在运行状态中一直检验一个状态,如果这个状态为真,就一直运行,如果外界更改了这个状态变量,那么线程就停止运行. sleep()使

啊哈,yield

文章出处:http://www.cnblogs.com/winstic/,请保留此连接 在python编程中,我们经常会看到函数中带有yield关键字,但请注意,此时的函数不再是我们熟知的一般函数,而是所谓的generator(生成器) 生成器 对于生成器,可以对比于列表来看,我们在循环代码中经常会使用range()产生一个list对象,继而在for循环下依次遍历, for i in range(1000): print i 或者是使用列表生成式生成一个list对象: [x * x for x