Это быстрее список.Удалить(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 быстрее.

но чего вы хотите достичь?


учитывая, что .Net заражает вектор (или массив), а не связанный список, RemoveAt () быстрее.


использовать System.Diagnostics.Stopwatch()

Я бы просто создал небольшое консольное приложение, чтобы проверить, что быстрее.