>백엔드 개발 >C#.Net 튜토리얼 >C#의 foreach 및 Yield 예제에 대한 자세한 설명

C#의 foreach 및 Yield 예제에 대한 자세한 설명

黄舟
黄舟원래의
2017-10-05 15:31:262100검색

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, IEnumerator 또는 IEnumerator여야 합니다.

b. ref 또는 out 매개변수를 가질 수 없습니다.

yield 반환 문은 try-catch 블록 안에 있을 수 없습니다. Yield return 문은 try-finally


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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.