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