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. GetEnumerator();
 while (enumerator.MoveNext())
 {
 Person p = (Person) enumerator.Current;
 Console.WriteLine(p);
 }

2. yield语句

•yield语句的两种形式:


代码如下:

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块

代码如下:

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语句迭代集合

代码如下:

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语句实现以不同方式迭代集合的类:

代码如下:

using System;
 using System.Collections.Generic;

namespace ConsoleApplication8
 {
     class Program
     {
         static void Main(string[] args)
         {
             MusicTitles titles = new MusicTitles();
             foreach (string title in titles)
             {
                 Console.WriteLine(title);
             }
             Console.WriteLine();

foreach (string title in titles.Reverse())
             {
                 Console.WriteLine(title);
             }
             Console.WriteLine();

foreach (string title in titles.Subset(2, 2))
             {
                 Console.WriteLine(title);
                 Console.ReadLine();
             }
         }
     }

public class MusicTitles
     {
         string[] names = { "a", "b", "c", "d" };
         public IEnumerator<string> GetEnumerator()
         {
             for (int i = 0; i < 4; i++)
             {
                 yield return names[i];
             }
         }

public IEnumerable<string> Reverse()
         {
             for (int i = 3; i >= 0; i--)
             {
                 yield return names[i];
             }
         }

public IEnumerable<string> Subset(int index, int length)
         {
             for (int i = index; i < index + length; i++)
             {
                 yield return names[i];
             }
         }
     }
 }

输出:

(0)

相关推荐

  • C#使用foreach遍历哈希表(hashtable)的方法

    本文实例讲述了C#使用foreach遍历哈希表(hashtable)的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collection; namespace HashSampleApplication1 { class Program { static void Main() { Hashtable hash = new Hashtable(); hashtable[1] = "kaka"; hashtable[2] = &qu

  • C#使用foreach语句遍历二维数组的方法

    本文实例讲述了C#使用foreach语句遍历二维数组的方法.分享给大家供大家参考.具体分析如下: 如果通过for语句循环遍历二维数组需要两重循环才可以,二foreach语句只需要一次可以完全遍历整个二维数组,下面是代码演示 using System; public class w3demo{ public static void Main() { int sum = 0; int[,] nums = new int[3,5]; // give nums some values for(int i

  • C#中foreach语句深入研究

    1.概述 本文通过手动实现迭代器来了解foreach语句的本质. 2.使用foreach语句遍历集合 在C#中,使用foreach语句来遍历集合.foreach语句是微软提供的语法糖,使用它可以简化C#内置迭代器的使用复杂性.编译foreach语句,会生成调用GetEnumerator和MoveNext方法以及Current属性的代码,这些方法和属性恰是C#内置迭代器所提供的.下面将通过实例来说明这一切. 例1:使用foreach来遍历集合 //*************************

  • C#使用foreach语句简单遍历数组的方法

    本文实例讲述了C#使用foreach语句简单遍历数组的方法.分享给大家供大家参考.具体如下: using System; public class jb51demo { public static void Main() { int sum = 0; int[] nums = new int[10]; // give nums some values for(int i = 0; i < 10; i++) nums[i] = i; // use foreach to display and su

  • C#中foreach实现原理详解

    本文主要记录我在学习C#中foreach遍历原理的心得体会. 对集合中的要素进行遍历是所有编码中经常涉及到的操作,因此大部分编程语言都把此过程写进了语法中,比如C#中的foreach.经常会看到下面的遍历代码: var lstStr = new List<string> { "a", "b" }; foreach (var str in lstStr) { Console.WriteLine(str); } 实际此代码的执行过程: var lstStr

  • C#中用foreach语句遍历数组及将数组作为参数的用法

    对数组使用 foreach C#提供 foreach 语句. 该语句提供一种简单.明了的方法来循环访问数组或任何可枚举集合的元素. foreach 语句按数组或集合类型的枚举器返回的顺序处理元素,该顺序通常是从第 0 个元素到最后一个元素. 例如,以下代码创建一个名为 numbers 的数组,并使用 foreach 语句循环访问该数组: int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 }; foreach (int i in numbers) { Sy

  • C#中foreach语句使用break暂停遍历的方法

    本文实例讲述了C#中foreach语句使用break暂停遍历的方法.分享给大家供大家参考.具体分析如下: 下面的代码演示了在C#中使用foreach时如何通过break语句暂停数据遍历 using System; public class w3demo { public static void Main() { int sum = 0; int[] nums = new int[10]; // give nums some values for(int i = 0; i < 10; i++) n

  • C#中循环语句:while、for、foreach的使用

    循环结构可以实现一个程序模块的重复执行,它对于我们简化程序,更好地组织算法有着重要的意义.C#为我们提供了若干种循环语句,分别适用于不同的情形,下面依次介绍. C#中循环语句:while.for.foreach 1.while循环 static void Main(string[] args) { int[] hs = { 1,2,3,4,5,6,7,8,9}; int ligh = hs.Length; while (ligh > 0) { Console.WriteLine(hs[ligh

  • C#使用foreach语句遍历堆栈(Stack)的方法

    本文实例讲述了C#使用foreach语句遍历堆栈(Stack)的方法.分享给大家供大家参考.具体如下: using System; using System.Collections; public class StacksW3 { static void Main(string[] args) { Stack a = new Stack(10); int x = 0; a.Push(x); x++; a.Push(x); foreach (int y in a) { Console.WriteL

  • C#使用foreach语句遍历队列(Queue)的方法

    本文实例讲述了C#使用foreach语句遍历队列(Queue)的方法.分享给大家供大家参考.具体如下: using System; using System.Collections; public class QueuesW3 { static void Main(string[] args) { Queue a = new Queue(10); int x = 0; a.Enqueue(x); x++; a.Enqueue(x); foreach (int y in a) { Console.

随机推荐