Using foreach with Collections

foreach 구문을 이용해서 오브젝트의 내용을 반복적으로 접근하고 다루기 위해서는 foreach 내부에서 열거자를 어떻게 변환 하는지 알 필요가 있다.

foreach 명령문:

 foreach  (ItemType item  in    myCollection)

 

foreach (string s in myCollection)
{
     Console.WriteLine("String is {0}", s);
}

내부에서 처리 되는 코드로 변환후

IEnumerator enumerator = ((IEnumerator) myCollection).GetEnumerator();

while(enumerator.GetNext())
{
      string s = (string) enumerator.Current;
      Console.WriteLine("String is {0}", s);
}

오브젝트에서 컬렉션을 이용하기 위해 필요한건 다음과 같다.

1. 열거자를 리턴하는 GetEnumerator() 메쏘드를 제공해야 한다.

2. ItemTyp를 리턴하는 프로퍼티 Current를 제공해야 한다.     
   Current는 접근자는 컬렉션의 현재 요소를 반환한다.

3. bool 값을 리턴하는 MoveNext를 제공해야 한다.
   다음 데이터가 있다면 true를 리턴한다.

컬렉션을 사용하기 위해서는 GetEnumerator(), 프로퍼티 Current, MoveNext() 3가지를 클래스내에 만들어야 한다.
Reset()도 같이 추가해주는게 좋다.

컬렉션을 사용하기 위한 3가지 방법

1. 오브젝트내에 GetEnumerator, Current, MoveNext를 만든다. C#에서만 사용 가능하다. (예제1-1, 예제2-2)

2.  IEnumerable 인터페이스를 상속한 오브젝트내에 GetEnumerator, Current, MoveNext를 만든다.
    C# 뿐만 아니라 비쥬얼 베이직 같은 다른 언어에서도 사용 할 수 있다.(제네릭 컬렉션) (예제2)

3. ArrayList나 Hashtable 같이 미리 만들어져 있는 컬렉션을 사용하는 방법

예제1-1

 

 

예제1-2   1-1의 MyEnumerator 대신 MyCollection을 사용

 

 

예제2)

 


참조:

     Using foreach with Collections
     http://msdn2.microsoft.com/en-us/library/aa288257(VS.71).aspx#vclrfforeachcollections_example2b