博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#:foreach语句,yield语句
阅读量:6957 次
发布时间:2019-06-27

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

原文:

1. foreach语句

C#编译器会把foreach语句转换为IEnumerable接口的方法和属性。

1 foreach (Person p in persons)2 {3 Console.WriteLine(p);4 }

foreach语句会解析为下面的代码段。

  • 调用GetEnumerator()方法,获得数组的一个枚举
  • 在while循环中,只要MoveNext()返回true,就一直循环下去
  • 用Current属性访问数组中的元素
1 IEnumerator enumerator = persons. GetEnumerator();2 while (enumerator.MoveNext())3 {4 Person p = (Person) enumerator.Current;5 Console.WriteLine(p);6 }

 

2. yield语句

  • yield语句的两种形式:
1 yield return 
;2 yield break;
  • 使用一个yield return语句返回集合的一个元素
  • 包含yield语句的方法或属性是迭代器。迭代器必须满足以下要求

a. 返回类型必须是、、或 。

b. 它不能有任何ref或out参数

  • yield return语句不能位于try-catch快。yield return语句可以位于try-finally的try块
1             try 2             { 3                 // ERROR: Cannot yield a value in the boday of a try block with a catch clause 4                 yield return "test"; 5             } 6             catch 7             { } 8  9             try10             {11                 // 12                 yield return "test again";13             }14             finally15             { }16 17             try18             { }19             finally20             { 21                 // ERROR: Cannot yield in the body of a finally clause22                 yield return ""; 23             }
  • yield break语句可以位于try块或catch块,但是不能位于finally块

 

下面的例子是用yield return语句实现一个简单集合的代码,以及用foreach语句迭代集合

1 using System; 2 using System.Collections.Generic; 3  4 namespace ConsoleApplication6 5 { 6     class Program 7     { 8         static void Main(string[] args) 9         {10             HelloCollection helloCollection = new HelloCollection();11             foreach (string s in helloCollection)12             {13                 Console.WriteLine(s);14                 Console.ReadLine();15             }16         }17     }18 19     public class HelloCollection20     {21         22         public IEnumerator
GetEnumerator()23 {24 // yield return语句返回集合的一个元素,并移动到下一个元素上;yield break可以停止迭代25 yield return "Hello";26 yield return "World";27 }28 }29 }

使用yield return语句实现以不同方式迭代集合的类:

1 using System; 2 using System.Collections.Generic; 3  4 namespace ConsoleApplication8 5 { 6     class Program 7     { 8         static void Main(string[] args) 9         {10             MusicTitles titles = new MusicTitles();11             foreach (string title in titles)12             {13                 Console.WriteLine(title);14             }15             Console.WriteLine();16 17             foreach (string title in titles.Reverse())18             {19                 Console.WriteLine(title);20             }21             Console.WriteLine();22 23             foreach (string title in titles.Subset(2, 2))24             {25                 Console.WriteLine(title);26                 Console.ReadLine();27             }28         }29     }30 31     public class MusicTitles32     {33         string[] names = { "a", "b", "c", "d" };34         public IEnumerator
GetEnumerator()35 {36 for (int i = 0; i < 4; i++)37 {38 yield return names[i];39 }40 }41 42 public IEnumerable
Reverse()43 {44 for (int i = 3; i >= 0; i--)45 {46 yield return names[i];47 }48 }49 50 public IEnumerable
Subset(int index, int length)51 {52 for (int i = index; i < index + length; i++)53 {54 yield return names[i];55 }56 }57 }58 }

输出:

 

 

转载地址:http://jkqil.baihongyu.com/

你可能感兴趣的文章
其实微信小程序也没那么复杂
查看>>
体验下 Go 语言的魅力(初试)
查看>>
Docker 快速入门
查看>>
UIBarButtonItem 在 iOS 11 上的改变及应对方案
查看>>
再聊神经网络与深度学习
查看>>
OkHttp源码解析
查看>>
React全家桶+Egg 做一个协作聊天室~
查看>>
小程序从手动埋点到自动埋点
查看>>
vue-devtools的安装与使用
查看>>
iOS ARKit录制视频(AVAssetWriter & 有声音)
查看>>
### bootstrap-datepicker 与bootstrapValidator同时使用时,选择日期后,无法正常触发校验...
查看>>
2019最新前端面试宝典
查看>>
Puppeteer爬取网页数据
查看>>
flutter 语言篇四
查看>>
月薪80K前端大佬笔记学习vue的心得,网友:两个字“完美”!
查看>>
「中高级前端面试」JavaScript手写代码无敌秘籍
查看>>
【通用技术】Git 完全自学手册
查看>>
unable to access 'https://github.com/DajuanM/DHAlgorithms.git/': The requested U
查看>>
iOS 之VLC使用RTSP流做监控或者直播视频
查看>>
restful+springmvc+mybatis+ webservice 分布式架构
查看>>