Приветствую всех, сегодня я хотел бы привести пример того как можно создать свой собственный обобщенный список по типу List. Который пользуется практически каждый программист. Но многие не задумываются о том как он работает изнутри. Да и по секрету скажу, наткнулся на одно задание в интернете, и мне показалось интересным оно, в задании было сказано создать свой обобщенный список , с теме же методами что и в List. Я конечно не стал все возможности реализовывать, но то что успел написать для вас в течении часа выкладываю.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
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 в котором покажу как демонстрируется работа моего обобщенного класса коллекции.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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(); } |