2010-07-09 8 views

Respuesta

15

List.Remove (T) usa IndexOf y RemoveAt (int) en su implementación. Entonces List.RemoveAt (int) es más rápido.

public bool Remove(T item) 
{ 
    int index = this.IndexOf(item); 
    if (index >= 0) 
    { 
     this.RemoveAt(index); 
     return true; 
    } 
    return false; 
} 
+0

Pero si hace que su código sea peor o ilegible, podría seguir usando Remote (T). –

+0

El código 'this.IndexOf (item)' tiene un precio enorme en términos de rendimiento, ya que escanea toda la matriz de respaldo hasta que se elimina el elemento. Especialmente cuando el elemento que se va a eliminar se encuentra al final de la lista, escanea toda la lista cada vez que se solicita una eliminación. Me sucedió cuando estaba tratando de implementar una estructura de datos de pila con la ayuda de una clase 'List '. A medida que el tamaño de la lista crece considerablemente, p. más allá de los elementos de 10K, la eliminación desde el final usando Eliminar (T) puede arruinar el caos de su programa. – RBT

0

Remove (T) hace una llamada interna a RemoveAt (int) así, haciendo directamente una RemoveAt es más rápido.

Pero ¿qué quieres lograr?

19

Respuesta simple:

En general, RemoveAt es más rápido, aunque no siempre enormemente.

Respuesta larga:

vamos a considerar el encontrar el elemento apropiado en primer lugar. El método Remove tiene que buscar en la lista el elemento que coincide con el objeto dado, y por lo tanto es O(n) el tiempo en general. RemoveAt en una lista simplemente puede indexar el artículo dado, y por lo tanto es O(1).

Ahora, eliminar un elemento del final de una lista es siempre O(1) por supuesto, pero en general eliminar un artículo lleva O(n) tiempo, porque es necesario realizar una reorganización (moviendo elementos después del eliminado hacia adelante). Por lo tanto, en el caso general, la complejidad de tiempo total para la eliminación es O(n) + O(n) o O(n) + O(1) para Eliminar y Eliminar respectivamente, por lo tanto simplemente O(n) en cualquier caso. Sin embargo, se garantiza que el RemoveAt sea al menos tan rápido, aunque el escalado es el mismo a menos que sepa que lo está eliminando en/cerca del final.

+0

Gracias, ahora entiendo por qué MSDN dice que RemoveAt es O (n) donde n es Count-index – Yellowfog

0

Uso System.Diagnostics.Stopwatch()

Me hubiera acaba de crear una pequeña aplicación de consola para comprobar que es más rápido.

0

Dado que .Net infecta un vector (o matriz), no una lista vinculada, RemoveAt() es más rápido.

Cuestiones relacionadas