Создаем собственный обобщенный список по типу List<>

Приветствую всех, сегодня я хотел бы привести пример того как можно создать свой собственный обобщенный список по типу List. Который пользуется практически каждый программист. Но многие не задумываются о том как он работает изнутри. Да и по секрету скажу, наткнулся на одно задание в интернете, и мне показалось интересным оно, в задании было сказано создать свой обобщенный список , с теме же методами что и в List. Я конечно не стал все возможности реализовывать, но то что успел написать для вас  в течении часа выкладываю.

 class MyList<T> : IEnumerable, IEnumerator
    {
  
        int count = 0; //количество содержащихся элементов в массиве, размер массива
        public int Count { get => count; }

        T[] mass = new T[1]; //обобщенный массив.

        int position = -1; //позиция перебора начинается с -1 индекса
        int pos = -1; //по этой позиции производится запись в массив

        public void Clear() //метод очистки массива и обнуления всех счетчиков
        {
            mass = new T[1];
            count = 0;
            pos = -1;
        }

        public bool Contains(T item) //метод поиска элемента в массиве
        {

            foreach (T val in mass)
            {
                if (val.Equals(item))
                    return true;
            }
            return false;
        }

        public void Add(T mass) //метод добавления в массив элемента
        {
            count++;  //увеличиваем размер массива
            Array.Resize(ref this.mass, count);
            pos++; //увеличиваем индекс
            this.mass[pos] = mass; //добавляем значение

        }
        //это все реализация методов интерфейса IEnumerator

        public bool MoveNext() //изменяет счетчик или ссылку на следующий элемент списка
        {
            position++;
            return (position < mass.Length);
        }

        public void Reset() //Сбросить счетчик.
        {
            position = -1;
        }
        public T Current
        {
            get { try { return mass[position];}catch (IndexOutOfRangeException) { throw new InvalidOperationException();}}
        }


        object IEnumerator.Current //Метод должен возвращать текущий элемент списка.
        {
            get{ return Current;}
        }


        public IEnumerator GetEnumerator()//это метод интерфейса IEnumerable
        {
            return mass.GetEnumerator();
        }

        public T this[int index]  //тут создали индексатор
        {
            get { return mass[index]; }
            set { mass[index] = value; }
        }
        

    }
}

В классе MyList я реализовал основной функционал, по типу List. В листинге программы дал подробный комментарий практически построчно, не думаю что у вас возникнут какие либо трудности. За одно я выложу класс Main в котором покажу как демонстрируется работа моего обобщенного класса коллекции.

  static void Main(string[] args)
        {
            MyList<int> list = new MyList<int>();

            for (int i = 0; i < 10; i++) //добавляем значения в список
                list.Add(i);


            foreach (int r in list)
            {
                Console.WriteLine(r);
            }

            list.Clear(); //очищаем список

            Console.WriteLine("Размер листа {0}", list.Count); //показываем размер коллекции

            for (int i = 10; i > 0; i--)//добавляем значения в список
                list.Add(i);

            foreach (int r in list) //выводим содержимое коллекции
            {
                Console.WriteLine(r);
            }


            if (list.Contains(2)) //поиск в коллекции
            {
                Console.WriteLine("Входит");
            }
            else
            {
                Console.WriteLine("Значение не найдено!");
            }

            Console.ReadKey();

        }

 

Обновлено: 23.03.2018 — 22:05

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.