컴퓨터 공부/C#

Iterators

려리군 2009. 8. 24. 16:20

foreach 반복문

foreach(object obj in list)

{

    DoSomthing(obj);

}

효과적이고 사용하기 쉬움


foreach문을 지원하는 타입

1. 기존타입(Array,List..)을 상속하여 사용

2. 새로운 타입 선언 가능 -> 인터페이스 구현


foreach를 지원하는 타입 정의(C#1.0)

IEnumerator e = list.getEnumerator();    // 특정 메소드를 선언하고 있다고 가정한다.

while(e.MoveNext())     // 다음 한 칸 이동하고 이동가능한지 리턴.

{

    object obj = e.Current;

    DoSomething(obj);

}

※ foreach를 지원하기 위해서는 다음 인터페이스를 구현하면 된다.

1. IEnumerable

public interface IEnumerable{

    IEnumerator GetEnumerator();

}

2. IEnumerator

public interface IEnumerator{

    object Current {get;}    // object로 되어 있기 때문에 boxing, unboxing필요...

    bool MoveNext();        // 어떠한 순서로 돌아가는 지 정의... 한가지 형태의 반복만 가능.

    void Reset();

}


※ yield return을 통해서 컴파일러 수준에서 Enumerator를 만들어준다.

public IEnumerator GetEnumerator()

{

    for(int i=0; i <  Cities.Length; i++)

    {

        yield return Cities[i];

    }

}


※ IEnumerable<string>와 같이 Generic을 이용하면 속도가 더 빠를 수 있다. boxing, unboxing없음.


Iterator 구문(2.0)

반복문 내부에서 yield 키워드 사용

C# 컴파일러가 iterator를 대신 구현해줌.

IEnumerable과 IEnumerator의 구체적인 구현 생략가능.

Generics 버전 인터페이스 : IEnumerable<T>, IEnumerator<T>


Iterator 주의사항

중첩 foreach문 사용자제 -> index를 이용한 for 반복문 사용 권장.

'컴퓨터 공부 > C#' 카테고리의 다른 글

Nullable Type  (0) 2009.08.24
Generic  (0) 2009.08.20
Partial classes  (0) 2009.08.18
C# 3장 간단 정리  (0) 2009.07.13
C# 2장 간단 정리  (0) 2009.07.11