ホームページ >バックエンド開発 >C#.Net チュートリアル >C#のforeachとyieldの例を詳しく解説

C#のforeachとyieldの例を詳しく解説

黄舟
黄舟オリジナル
2017-10-05 15:31:262099ブラウズ

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 ステートメントの 2 つの形式:


yield return <expression>;yield break;

コレクションの要素を返すには、yield return ステートメントを使用します

yield ステートメントを含むメソッドまたはプロパティはイテレータです。イテレータは次の要件を満たす必要があります

a. 戻り値の型は IEnumerable、IEnumerable8742468051c85b06f0a0af9e3e506b5c、IEnumerator、または IEnumerator8742468051c85b06f0a0af9e3e506b5c である必要があります。

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];
            }
        }
    }
}

以上がC#のforeachとyieldの例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。