[c#] yield

C# 2021. 3. 11. 17:06
728x90
728x90

yield


집합적인 데이터셋으로부터 데이터를 하나씩 호출자에게 보내주는 yield는 Iterator, Enumerator라고 불린다

c# yield 키워드는 호출자(caller)에게 컬렉션 데이터를 하나씩 리턴할 때 사용

 

 

사용 방식


1)yield return 혹은 2)yield break 두 가지 방식으로 사용된다.

˙ yield return : 컬렉션 데이터를 하나씩 리턴할 때 사용

˙ yield break : 리턴을 중지하고 Iteration 루프를 빠져나올 때 사용

 

 

사용처


1. 데이터의 양이 커서 나눠서 리턴하는 것이 효율적일 때, 일부만 조회 필요할 때

2. 어떤 메서드가 데이터를 무제한 계속 리턴할 경우

3. 모든 데이터를 미리 계산하기에 느려져서 그때마다 On Demand로 처리하는 것이 좋을 때
(소수(Prime Number)를 계속 리턴하는 함수의 경우 소요시간을 분산하는 지연계산 등을 구현)

 

 

예시 1 


namespace YieldTest
{
  class Program
  {
    static void Main (string[] args)
    {
      var scores = GetAllScores ();

    // 통째로 가져온다
      foreach (var score in GetAllScores())
      {
	       Console.WriteLine (socre);
      } 
      
      // 하나씩 가져온다 
      // 진행상태를 기억한다
      foreach (var score in GetScores())
      {
	    Console.WriteLine (socre);
      }
    }

    static IEnumerable<int> GetScores ()
    {
      int[] scores = new int[]{ 10, 20, 30 };
      yield return scores[0];
      yield return scores[1];
      yield return scores[2];
    }

    static int[] GetAllScores ()
    {
      int[] scores = new int[]{ 10, 20, 30 };
      return scores;
    }
  }
}

 

 

예시 2


namespace YieldTest
{
  class Program
  {
    static void Main (string[] args)
    {
      foreach (var score in GetScores())
      {
	    Console.WriteLine (socre);
      }
    }

    static IEnumerable < int >GetScores ()
    {
      int[] scores = new int[]{ 10, 20, 30 };
      
        for(int i=0; i<scores.Length; i++) {
            yield return scores[i];
            Debug.WriteLine(i+ " : Done");
        }
    }
  }
}

 

 

 

예시 3


namespace YieldTest
{
  class Program
  {
    static void Main (string[] args)
    {
      foreach (var score in GetScores())
      {
	    Console.WriteLine (socre);
      }
    }

    static IEnumerable < int >GetScores ()
    {
      int[] scores = new int[]{ 10, 20, 30, 40};
      
        for(int i=0; i<scores.Length; i++) 
        {
            if(scores[i]== 30) {
                yield break;
            }
            yield return scores[i];
            Debug.WriteLine(i+ " : Done");
        }
    }
  }
}

 

 

 

예시 4


// 누적 합계를 구하는
namespace YieldTest
{
  class Program
  {
    static void Main (string[] args)
    {
      foreach (var total in 누적합계())
      {
	    Console.WriteLine (total);
      }
    }

    static IEnumerable < int > 누적합계 ()
    {
      int[] scores = new int[]{ 10, 20, 30, 40};
      
      	int total = 0;
        
        for(int i=0; i<scores.Length; i++) 
        {
           total += scores[i];
           yield return total;
        }
    }
  }
}

 

 

 

www.csharpstudy.com/CSharp/CSharp-yield.aspx

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v