Это быстрее список.Удалить(T) или список.RemoveAt(int) метод?
это быстрее List<T>.Remove(T)
или List<T>.RemoveAt(int)
метод в коллекциях .NET? Скорость разных типов значений и ссылочных типов?
5 ответов
список.Remove(T) использует IndexOf и RemoveAt (int) в своей реализации. Итак, Список.RemoveAt (int) быстрее.
public bool Remove(T item)
{
int index = this.IndexOf(item);
if (index >= 0)
{
this.RemoveAt(index);
return true;
}
return false;
}
простой ответ:
в общем, RemoveAt
быстрее, хотя и не всегда очень.
ответ:
давайте сначала рассмотрим поиск подходящего элемента. The Remove
метод должен искать в списке элемент, соответствующий данному объекту, и, таким образом,O(n)
времени в целом. RemoveAt
в списке можно просто проиндексировать данный элемент и таким образом O(1)
.
теперь удаление элемента из конца из списка всегда O(1)
конечно, но в целом удаление элемента O(n)
время, потому что перетасовка должна быть сделана (перемещение элементов после удаления вперед). Таким образом, в общем случае общая сложность времени для удаления либо O(n) + O(n)
или O(n) + O(1)
для удалить и RemoveAt соответственно, поэтому просто O(n)
в любом случае. Однако,RemoveAt
гарантированно будет по крайней мере так же быстро, хотя масштабирование одинаково, если вы не знаете, что удаляете его в/около конца.
Remove (T) делает внутренне вызов RemoveAt(int) таким образом, делать непосредственно removeAt быстрее.
но чего вы хотите достичь?
использовать System.Diagnostics.Stopwatch()
Я бы просто создал небольшое консольное приложение, чтобы проверить, что быстрее.