Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung von Beispielen für foreach und yield in C#

Detaillierte Erläuterung von Beispielen für foreach und yield in C#

黄舟
黄舟Original
2017-10-05 15:31:262068Durchsuche

1. foreach

Der C#-Compiler konvertiert die foreach-Anweisung in die Methoden und Eigenschaften der IEnumerable-Schnittstelle.


foreach (Person p in persons)
 {
     Console.WriteLine(p);
 }

Die foreach-Anweisung wird in das folgende Codesegment analysiert.

Rufen Sie die GetEnumerator()-Methode auf, um eine Aufzählung des Arrays zu erhalten

In der while-Schleife wird die Schleife fortgesetzt, solange MoveNext() true zurückgibt

Verwendung das Current-Attribut für den Zugriff auf Elemente im Array


IEnumerator enumerator = persons. GetEnumerator(); while (enumerator.MoveNext())
 {
    Person p = (Person) enumerator.Current;
    Console.WriteLine(p);
}

2. Zwei Formen der Ertragsangabe:


Verwenden Sie eine Yield-Return-Anweisung, um ein Element der Sammlung zurückzugeben

yield return <expression>;yield break;
Die Methode oder Eigenschaft, die die Yield-Anweisung enthält, ist ein Iterator. Iteratoren müssen die folgenden Anforderungen erfüllen:

a Der Rückgabetyp muss IEnumerable, IEnumerable8742468051c85b06f0a0af9e3e506b5c, IEnumerator oder IEnumerator8742468051c85b06f0a0af9e3e506b5c sein.

b. Es darf keine Ref- oder Out-Parameter haben.

Die yield return-Anweisung darf sich nicht in einem Try-Catch-Block befinden. Die yield return-Anweisung kann sich im try-finally try-Block befinden


Die yield break-Anweisung kann sich im try-Block oder Catch-Block befinden, aber nicht befindet sich im „finally“-Block

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 ""; 
             }
Bei den folgenden Beispielen handelt es sich um Code, der die yield return-Anweisung verwendet, um eine einfache Sammlung zu implementieren, und die foreach-Anweisung verwendet, um die Sammlung zu iterieren


Verwenden der yield return-Anweisung, um die Sammlung auf unterschiedliche Weise zu iterieren. Klasse:

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


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

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für foreach und yield in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn