Приветствую всех, сегодня я хотел бы привести пример того как можно создать свой собственный обобщенный список по типу 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(); }