열거형 GetEnumerator(), IEnumerable, IEnumerator 정의
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestE
{
class User
{
public User(string name) { _name = name; }
public string Name{ get{ return _name;} }
string _name;
}
class DBManager : IEnumerable
{
public DBManager()
{
_onlineUsers.Add (new User ("tom"));
_onlineUsers.Add (new User ("Krista"));
_onlineUsers.Add (new User ("Emma"));
}
public IEnumerator GetEnumerator() //이 함수를 불릴때 원소를 복사하는 방식 => 메모리 측면에서 효율적인 방법은 아님
{
return new Enumerator (_onlineUsers);
}
ArrayList _onlineUsers = new ArrayList();
class Enumerator : IEnumerator
{
const string INVALID_RECORD = "use ss";
public Enumerator(ArrayList onlineUsers)
{
foreach(User user in onlineUsers)
{
this._onlineUsers.Add(user);
}
Reset();
}
public bool MoveNext()
{
return ++_index < _onlineUsers.Count;
}
public object Current
{
get
{
if (_index == -1)
throw new InvalidOperationException (INVALID_RECORD);
if (_index < _onlineUsers.Count)
return _onlineUsers [_index];
else
return null;
}
}
public void Reset(){ _index = -1; }
int _index;
ArrayList _onlineUsers = new ArrayList();
}
}
class Program
{
static void Main(string[] args)
{
DBManager db = new DBManager ();
IEnumerator e = db.GetEnumerator ();
while (e.MoveNext ()) {
User user = (User)e.Current;
Console.WriteLine ("{0}", user.Name);
}
foreach (User user in db) {
Console.WriteLine ("{0}", user.Name);
}
Console.ReadLine ();
}
}
}