C#中foreach与yield的实例详解


本文摘自PHP中文网,作者黄舟,侵删。

1. foreach

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


1

2

3

4

foreach (Person p in persons)

 {

     Console.WriteLine(p);

 }

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

调用GetEnumerator()方法,获得数组的一个枚举

在while循环中,只要MoveNext()返回true,就一直循环下去

用Current属性访问数组中的元素


1

2

3

4

5

IEnumerator enumerator = persons. GetEnumerator(); while (enumerator.MoveNext())

 {

    Person p = (Person) enumerator.Current;

    Console.WriteLine(p);

}

2. yield语句

yield语句的两种形式:


1

yield return <expression>;yield break;

使用一个yield return语句返回集合的一个元素

包含yield语句的方法或属性是迭代器。迭代器必须满足以下要求

a. 返回类型必须是IEnumerable、IEnumerable<T>、IEnumerator或 IEnumerator<T>。

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

yield return语句不能位于try-catch快。yield return语句可以位于try-finally的try块


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

try

              {                  // ERROR: Cannot yield a value in the boday of a try block with a catch clause

                 yield return "test";

              }             catch

             { }

              try

             {                 //

                 yield return "test again";

             }             finally

             { }

             try

             { }             finally

             {

                 // ERROR: Cannot yield in the body of a finally clause

                yield return "";

             }

yield break语句可以位于try块或catch块,但是不能位于finally块

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

using System;using System.Collections.Generic;namespace ConsoleApplication6

{    class Program

    {        static void Main(string[] args)

        {

            HelloCollection helloCollection = new HelloCollection();            foreach (string s in helloCollection)

            {

                Console.WriteLine(s);

                Console.ReadLine();

            }

        }

    }    public class HelloCollection

    {       

        public IEnumerator<String> GetEnumerator()

        {            // yield return语句返回集合的一个元素,并移动到下一个元素上;yield break可以停止迭代

            yield return "Hello";            yield return "World";

        }

    }

}

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


阅读剩余部分

相关阅读 >>

c#单例模式的实现以及性能对比的实例

c#中的正则表达式如何验证中文字符的实例

详解可选参数和命名参数实例

介绍c#中的接口

c# 一些面试试题的实例教程

c#中关于foreach遍历使用的深入理解

c#实现json序列化删除null值的方法实例

c#中datetime与时间戳转换的实例代码

c#实现添加word文本与图片超链接的方法

c#中如何使用sendmessage?

更多相关阅读请进入《foreach》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...