Yield 키워드
개요
- yield를 알기위해서는 Enumerable을 알아야 할 필요가 있다.
1. IEnumerable
- array는 정적이다. 하지만 IEnumerable은 동적인 공간을 가지고 있어, 동적인 데이터를 저장하기에 좋다.
- LINQ를 사용하기에 좋다.
2. IEnumerable vs List
- 두가지다 동적인 공간을 제공한다. 차이는 무엇이 있을까
차이점
- List는 IEnumeralble을 상속받는다 때문에 아래와 같이 캐스팅해야한다.
IEnumerable iEnumerable = new List(); -- O 가능
List list = new IEnumerable(); -- X 불가능
-> (수정) List list = new IEnumerable().toList //.toList를 사용해서 캐스팅을 해야한다.
- IEnumerable을 .toList로 캐스팅 했을때 List와 성능차이가 있을까?
DataSample sample = new DataSample(); Stopwatch enumerableTime = new Stopwatch(); Stopwatch listTime = new Stopwatch(); enumerableTime.Start(); for (int i = 0; i < 99999; i++) { IEnumerable<SData>
Debug.WriteLine("IEnumeable: "+ enumerableTime.Elapsed.ToString()); Debug.WriteLine("List : "+ listTime.Elapsed.ToString());enumerable = sample.DataReturn().ToList(); } enumerableTime.Stop(); listTime.Start(); for (int i = 0; i < 99999; i++) { List<SData> list = sample.DataReturn(); } listTime.Stop();
결과
IEnumeable : 00:00:06.9410699
List : 00:00:06.8256681
크게 많은 차이는 없다.
- IEnumerable을 .toList로 캐스팅 했을때 List에 넣을 수 있을까?
IEnumerable enumerableTest = sample.DataReturn().ToList();
IEnumerable enumerableTest2 = sample.DataReturn().ToList();
List listTest = enumerableTest; //(X)
List listTest2 = enumerableTest2.ToList; //(X)
- 기본적으로 List<>는 IEnumerable을 상속 받은 것이기 때문에 .toList로 캐스팅을 해도 List<>넣을 수 없다.
3. Yield
- C#의 yield키워드는 호출자에게 컬렉션 데이터를 하나씩 리턴할 때 사용한다.
- 반환형이 IEnumerable 이어도 yield return을 사용하면 조건안에만 return을 하면 된다.
public class IEnumerableCheck
{
//IEnumerable에 yield를 사용해서 컬렉션 데이터를 하나씩 리턴
public IEnumerable GetEnumerator()
{
DataSample sample = new DataSample();
List<SData> list = sample.DataReturn();
IEnumerable<SData> enumerable = sample.DataReturn();
IEnumerator e = enumerable.GetEnumerator();
while (e.MoveNext())
{
Console.WriteLine(e.Current);
yield return e.Current;
}
}
}
'Programming > C#' 카테고리의 다른 글
C# Anonymous Type (0) | 2016.02.25 |
---|---|
C# Lamda (0) | 2016.02.25 |
C# Partial Type (0) | 2016.02.18 |
C# NullType (0) | 2016.02.18 |
C# Anonymous Method (0) | 2016.02.18 |