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{ getreturn _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 ();
        }
    }


}

반응형

+ Recent posts