아카이빙/C#

[C#] foreach 가능한 객체 만들기

셩님 2018. 6. 20. 04:51

[C#] foreach 가능한 객체 만들기

  • 인덱서와 IEnumerable, IEnumerator 인터페이스를 활용하여 foreach가 가능한 객체를 만들수 있다.

IEnumerable

  • IEnumerator GetEnumerator() : IEnumerator 형식의 객체를 반환

IEnumerator

  • boolean MoveNext() : 다음 요소로 이동한다. 컬렉션의 끝을 지나면 false, 이동 성공하면 true 반환

  • void Reset() : 컬렉션의 첫 번째 위치의 앞으로 이동.

  • Object Current {get;} : 컬렉션의 현재 위치를 반환

Item 클래스

class Item
{
   public string Name{get;set;}
   public int Count{get;set;}

   public override string ToString()
  {
       return string.Format("(Name : {0}, Count : {1})", Name, Count);
  }
}

ItemList 클래스

class ItemList : IEnumerable, IEnumerator
{
   int position = -1;
   private Item[] arr;
   public ItemList(int value)
  {
       arr = new Item[value];
  }

   public Item this[int index]
  {
       get
      {
           return arr[index];
      }
       set
      {
           if(index >= arr.Length)
          {
               Array.Resize<Item>(ref arr, index + 1);
          }
           arr[index] = value;
      }
  }

//IEnumerator 멤버
   public object Current
  {
       get
      {
           return arr[position];
      }
  }

//IEnumerator 멤버
   public bool MoveNext()
  {
       if(position == arr.Length - 1)
      {
           Reset();
           return false;
      }
       position++;
       return (position < arr.Length);
  }

//IEnumerator 멤버
   public void Reset()
  {
       position = -1;
  }

//IEnumerable 멤버
   public IEnumerator GetEnumerator()
  {
       for(int i=0; i<arr.Length; i++)
      {
           yield return arr[i];
      }
  }
}
  • 배열의 범위를 초과하는 인덱스에 접근하면 resize후 반환한다.

테스트

class MainApp
{
   static void Main()
  {
       ItemList itemList = new ItemList(3);
       itemList[0] = new Item(){
           Name = "고양이 수염",
           Count = 3
      };

       itemList[1] = new Item(){
           Name = "치즈맛 젤리",
           Count = 12
      };

       itemList[2] = new Item(){
           Name = "츄르",
           Count = 43
      };

       itemList[4] = new Item(){
           Name = "두부모래",
           Count = 53
      };

       foreach(var item in itemList)
      {
           Console.WriteLine(item);
      }
  }
}

(Name : 고양이 수염, Count : 3)
(Name : 치즈맛 젤리, Count : 12)
(Name : 츄르, Count : 43)

(Name : 두부모래, Count : 53)

참조

  • 뇌를 자극하는 C# 5.0 프로그래밍, 박상현, 한빛미디어 


'아카이빙 > C#' 카테고리의 다른 글

[C#] 제네릭 클래스  (0) 2018.06.21
[C#] 제네릭 메소드  (0) 2018.06.21
[C#] 인덱서  (0) 2018.06.20
[C#] System.Array  (0) 2018.06.20
[C#] 프로퍼티  (0) 2018.06.20