C# yield return用法

本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解。具体如下:

yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历。

有这样的一个int类型的集合:

?


1

2

3

4

static List<int> GetInitialData()

{

  return new List<int>(){1,2,3,4};

}

需要打印出所有值大于2的元素。

不使用yield return的实现

?


1

2

3

4

5

6

7

8

9

10

11

12

static IEnumerable<int> FilterWithoutYield()

{

  List<int> result = new List<int>();

  foreach (int i in GetInitialData())

  {

 if (i > 2)

 {

   result.Add(i);

 }

  }

  return result;

}

客户端调用:

?


1

2

3

4

5

6

7

8

static void Main(string[] args)

{

  foreach (var item in FilterWithoutYield())

  {

 Console.WriteLine(item);

  }

  Console.ReadKey();

}

输出结果:3,4

使用yeild return实现

?


1

2

3

4

5

6

7

8

9

10

11

12

static IEnumerable<int> FilterWithYield()

{

  foreach (int i in GetInitialData())

  {

 if (i > 2)

 {

   yield return i;

 }

  }

  yield break;

  Console.WriteLine("这里的代码不执行");

}

客户端调用:

?


1

2

3

4

5

6

7

8

static void Main(string[] args)

{

  foreach (var item in FilterWithYield())

  {

 Console.WriteLine(item);

  }

  Console.ReadKey();

}

输出结果:3,4

总结:

通过单步调试发现:

虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。

第一种方法,客户端调用过程大致为:

使用yield return,客户端调用过程大致为:

使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?

--因为,编译器会生成一个状态机来维护迭代器的状态。

简单地说,当希望获取一个IEnumerable<T>类型的集合,而不想把数据一次性加载到内存,就可以考虑使用yield return实现"按需供给"。

希望本文所述对大家的C#程序设计有所帮助。

时间: 2024-11-03 21:14:02

C# yield return用法的相关文章

C# yield return 用法与解析

C# yield return 用法与解析 本文参考自:http://www.jb51.net/article/54810.htm 当初没有认真理解 yield 这个关键字,现在又遇到了依旧不理解,为了以后不再为了 yield 困惑,决定好好研究一下 yield 的用法与意义: yield 从字面上理解有“退位,屈服”的意思,转一下弯就理解成“权限转移”,也就是将控制权交给别人,在这里就是把集合里满足条件(如果没有过滤条件,就是全体)的个体的操作转移给另一个对象. class Program {

C#中yield return用法分析(转载自shichen2014)

本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 有这样的一个int类型的集合: ? 1 2 3 4 static List<int> GetInitialData() {   return new List<int>(){

C#中yield return用法分析

这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下. 本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 有

造轮子_C#中yield return用法分析

厂址: http://www.jb51.net/article/54810.htm static List<int> GetInitialData() {   return new List<int>(){1,2,3,4}; } 打印出所有值大于2的元素 不使用yield return的实现 static IEnumerable<int> FilterWithoutYield() {   List<int> result = new List<int&

C#中yield return用法

1.yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历 不使用yield return的实现 static IEnumerable<int> FilterWithoutYield() { List<int> result = new List<int>(); foreach (int i in GetInitialData()) { if (i > 2) { result

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

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

yield return的用法简介

使用yield return 语句可一次返回一个元素. 迭代器的声明必须满足以下要求: 返回类型必须为 IEnumerable.IEnumerable<T>.IEnumerator 或 IEnumerator<T>. 返回 IEnumerable 或 IEnumerator 的迭代器的 yield 类型为 object.如果迭代器返回 IEnumerable<T> 或 IEnumerator<T>,则必须将yield return 语句中的表达式   类型隐

C#中yield return的用法示例

using System; using System.Collections.Generic; namespace YieldReturn { class Program { static void Main(string[] args) { var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var resultNormal = EvenNormal(list); foreach (var item in resultNormal)

Unity3D教程:c#脚本yield的用法

Coroutines & Yield是Unity3D编程中重要的概念,它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行,但是在Javascript与C#中实现Coroutines & Yield,在语法上却有一些区别: javascript中yield用法很简单,直接yield就行了,或者yield WaitForSeconds (2); c#中的用法如下: yield不可单独使用 需要与return配合使用,例如: 1 yield return 0; //等0帧 2