[Data Structure] 4. 반복기 (Iterator)

dongwon lee·2023년 10월 18일

자료구조

목록 보기
4/5

반복기란 (Enumerator(Iterator))

자료구조에 저장되어 있는 요소들을 순회하는 인터페이스입니다.

void Iterator()
		{
			// 대부분의 자료구조가 반복기를 지원함
			// 반복기를 이용한 기능을 구현할 경우, 그 기능은 대부분의 자료구조를 호환할 수 있음
			List<int> list = new List<int>();
			LinkedList<int> linkedList = new LinkedList<int>();
			Stack<int> stack = new Stack<int>();
			Queue<int> queue = new Queue<int>();
			SortedList<int, int> sList = new SortedList<int, int>();
			SortedSet<int> set = new SortedSet<int>();
			SortedDictionary<int, int> map = new SortedDictionary<int, int>();
			Dictionary<int, int> dic = new Dictionary<int, int>();

			// 반복기를 이용한 순회
			// foreach 반복문은 데이터집합의 반복기를 통해서 단계별로 반복
			// 즉, 반복기가 있다면 foreach 반복문으로 순회 가능
			foreach (int i in list) { }
			foreach (int i in linkedList) { }
			foreach (int i in stack) { }
			foreach (int i in queue) { }
			foreach (int i in set) { }
			foreach (KeyValuePair<int, int> i in sList) { }
			foreach (KeyValuePair<int, int> i in map) { }
			foreach (KeyValuePair<int, int> i in dic) { }
			foreach (int i in IterFunc()) { }

			// 반복기 직접조작
			List<string> strings = new List<string>();
			for (int i = 0; i < 5; i++) strings.Add(string.Format("{0}데이터", i));

			IEnumerator<string> iter = strings.GetEnumerator();
			iter.MoveNext();
			Console.WriteLine(iter.Current);    // output : 0데이터
			iter.MoveNext();
			Console.WriteLine(iter.Current);    // output : 1데이터

			iter.Reset();
			while (iter.MoveNext())
			{
				Console.WriteLine(iter.Current);
			}
		}

IEnumerator

IEnumerable : IEnumerator를 Get하는데 필요한 인터페이스
IEnumerator : 열거자를 구현하는데 필요한 인터페이스

public IEnumerator<T> GetEnumerator()
{
	return new Enumerator(this);
}

IEnumerator IEnumerable.GetEnumerator()
{
	return new Enumerator(this);
}

public struct Enumerator : IEnumerator<T>
{
	private LinkedList<T> list;
	private LinkedListNode<T> node;
	private T current;

	internal Enumerator(LinkedList<T> list)
	{
		this.list = list;
		this.node = list.head;
		this.current = default(T);
	}

	public T Current { get { return current; } }

	object IEnumerator.Current { get { return current; } }

	public void Dispose() { }

	public bool MoveNext()
	{
		if (node != null)
		{
    	    current = node.Item;
            node = node.next;
			return true;
		}
		else
		{
			current = default(T);
			return false;
		}
	}

	public void Reset()
	{
    	this.node = list.head;
		current = default(T);
		}
	}
}

0개의 댓글