본문 바로가기

Programming/C#

C# Yield

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> enumerable = sample.DataReturn().ToList();
            }
            enumerableTime.Stop();
 
            listTime.Start();
            for (int i = 0; i < 99999; i++)
            {
                List<SData> list = sample.DataReturn();
            }
            listTime.Stop();
 
 
            Debug.WriteLine("IEnumeable: "+ enumerableTime.Elapsed.ToString());
            Debug.WriteLine("List      : "+ listTime.Elapsed.ToString());

결과

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