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;
}
}
}
}
728x90
728x90
'C#' 카테고리의 다른 글
비주얼스튜디오 솔루션, 프로젝트 이름 바꾸기 (0) | 2023.06.01 |
---|---|
[공유] ASP.NET MVC 액션 메서드 (0) | 2022.02.04 |
[공유] 메모리영역의 이해 (0) | 2021.03.12 |
[c#] 헬로월드, 콘솔아규먼트, 윈폼 (0) | 2021.03.09 |
C# 기초문법 빠르게 보기 (Microsoft Build) (0) | 2020.06.02 |