Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung von Beispielen für foreach und yield in C#
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!