인덱서와 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 |