본문 바로가기
C#

foreach가 가능한 객체 만들기

by 타블로 2013. 3. 23.

# IEnumerator, IEnumerable를 상속

 

IEnumerator GetEnumerator();

object Current { get; };

bool MoveNext();

void Reset();

 

 object Current

 

class MyList:IEnumerator, IEnumerable
    {
        public int[] array;
        int position = -1;

        public MyList()
        {
            // 초기생성시 배열크기 3 지정
            array = new int[3];
        }

        public int this[int idx]
        {
            get
            {
                // array[idx]에 해당하는 값 리턴
                return array[idx];
            }

            set
            {
                // 입력하려는 인덱스가 현재 array보다 크거나 같을 경우
                if (idx >= array.Length)
                {
                    // array 리사이징
                    Array.Resize<int>(ref array, idx + 1);
                    // 리사이징 알림문구 출력
                    Console.WriteLine("Array Resized : {0}", array.Length);
                }

                // array[idx]에 해당값 입력
                array[idx] = value;
            }
        }

 

###############################################################

        public object Current {
            get
            {
                // 현재 위치(position)의 값을 리턴
                return array[position];
            }
        }

        public IEnumerator GetEnumerator()
        {
            for (int i = 0; i < array.Length; i++)
            {
                //yield return (array[i]);
                yield return (array[i]);
            }
        }

        public bool MoveNext()
        {
            // 현재 위치값이 배열크기-1가 같을 경우
            if (position == array.Length - 1)
            {
                // 현재 위치값 초기화
                Reset();
                return false;
            }
           
            // 현재 위치값 +=1
            position++;
           
            // 현재 위치값보다 배열 크기가 true, 아닐 경우 false
            return (position < array.Length);
        }


        public void Reset()
        {
            //  현재 위치값 '-1' 초기화
            position = -1;
        }

###############################################################

        public static void main() {
            MyList ml = new MyList();

            for (int i = 0; i < 10; i++)
            {
                ml[i] = i;
            }

            //for (int i = 0; i < ml.array.Length; i++)
            //{
            //    Console.WriteLine(ml[i]);
            //}

            foreach (int value in ml)
            {
                Console.WriteLine(value);
            }

          
           
        }
    }