Как реализовать для своей коллекции метод Remove(T item)
(такой же, как в List<>
), удаляющий указанный элемент, но не меняющий реальной емкости массива?
У меня есть коллекция и ее параметры:
T[] arreay = new T[5];
public int count;
public int size;
public void Insert(int index, T item)
{
size++;
T[] arr = new T[size];
for (int i = 0; i < index; ++i)
{
arreay[i] = arr[i];
}
arreay[index] = item;
for (int i = index + 1; i < size; ++i)
{
arreay[i] = arr[i];
}
}
Простая реализация списка на базе массива:
elemenets
)size
). Это позволит не пересоздавать массив при вызове метода Remove
, а также иметь изначально массив не нулевого размера и увеличивать размер массива "с запасом" (для упрощения в примере кода массив увеличивается только до требуемого размера)Метод Insert(int index, T item)
:
index
допустимsize + 1
) и, при необходимости, увеличивает размер массиваindex
до size
вправо на одну позицию (index
-> index + 1
, ..., size - 1
-> size
)index
size
на единицуМетод Remove(T item)
:
item
в массивindex
больше либо равен 0), то:
index
до size
влево на одну позицию (index
<- index + 1
, ..., size - 1
<- size
)size
на единицуМетод Add(T item)
(в вопросе про него речь не шла, но он короткий и всё равно его пришлось писать для тестирования кода):
size + 1
) и, при необходимости, увеличивает размер массиваsize
)size
на единицуПример кода:
public class MyList<T>
{
private T[] elements = new T[5];
private int size = 0;
public void Insert(int index, T item)
{
if (index < 0 || index >= size)
throw new IndexOutOfRangeException($"Index: {index}, Size: {size}");
EnsureCapacity(size + 1);
for (var i = size; i > index; i--)
elements[i] = elements[i - 1];
elements[index] = item;
size++;
}
public void Remove(T item)
{
var index = Array.IndexOf(elements, item, 0, size);
if (index < 0)
return;
for (var i = index; i < size - 1; i++)
elements[i] = elements[i + 1];
size--;
}
public void Add(T item)
{
EnsureCapacity(size + 1);
elements[size] = item;
size++;
}
private void EnsureCapacity(int capacity)
{
if (elements.Length < capacity)
{
var arr = new T[capacity];
Array.Copy(elements, arr, size);
elements = arr;
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть проект на unityСуть в том, что при подгрузки нового(второго) уровня из префаба старый(первый) уровень с тегом Level я должен удалить