Из-за скуки я решил написать реализацию List с нуля, используя IEnumerable. Я столкнулся несколько вопросов, которые я честно не знаю, как решить:Запись реализации для списка <T> с использованием IEnumerable <T> с нуля
- Как бы вы изменить размер общего массива (T []), когда индекс обнуляется или устанавливается по умолчанию (T)?
- Поскольку вы не можете указать N, как вы преодолеваете числовую примитивную проблему с их значениями, равными 0 по умолчанию?
- Если ничего не может быть сделано относительно №2, как вы остановите метод GetEnumerator() из yield, возвращающего 0 при использовании числового типа данных?
И последнее, но не менее важное: какова стандартная практика сокращения массива? Я точно знаю, что одним из лучших решений для увеличения является увеличение текущей длины на мощность 2; если и когда вы уменьшаете размер? Per Remove/RemoveAt или используемая в данный момент длина% 2?
Вот что я сделал до сих пор:
public class List<T> : IEnumerable<T>
{
T[] list = new T[32];
int current;
public void Add(T item)
{
if (current + 1 > list.Length)
{
T[] temp = new T[list.Length * 2];
Array.Copy(list, temp, list.Length);
list = temp;
}
list[current] = item;
current++;
}
public void Remove(T item)
{
for (int i = 0; i < list.Length; i++)
if (list[i].Equals(item))
list[i] = default(T);
}
public void RemoveAt(int index)
{
list[index] = default(T);
}
public IEnumerator<T> GetEnumerator()
{
foreach (T item in list)
if (item != null && !item.Equals(default(T)))
yield return item;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
foreach (T item in list)
if (item != null && !item.Equals(default(T)))
yield return item;
}
}
Спасибо заранее.
_I точно знаю, что лучшим решением для увеличения является увеличение текущей длины на мощность 2_. Вы действительно знаете наверняка? В некоторых реализациях используется 'Count + Count/2'. –
Вместо использования 'foreach (T item in list)', do 'for (int i = 0; i
zneak
Для вашей проблемы с «ошибкой» это происходит потому, что вы позволите вашему массиву иметь «дыры». Стандартный «Список» решает проблему, с которой вы сталкиваетесь, не допуская отверстий. Если вы удаляете объект посередине, все они меняются на один индекс. –
zneak