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#中关于async与await的使用详解

c#中关于表达式树的简单介绍

dynamic(c# 参考)

c#根据表格偶数与奇数加载不同颜色的实例分析

介绍c#中的接口

c# 定时器timer的实例介绍

c#中发送邮件的实现方法详解

c#实现杨辉三角的示例

c# 中guid生成格式有哪些方法

c# webservice中访问http和https的wsdl以及生成配置节点的不同之处 (图)

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




打赏

取消

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

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

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

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

评论

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