¿Es más rápido el método List<T>.Remove(T)
o List<T>.RemoveAt(int)
en colecciones .NET? ¿La velocidad es diferente para tipos de valores o tipos de referencia?¿Es más rápido la Lista <T>. Eliminar (T) o Lista <T> Método .RemoveAt (int)?
Respuesta
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;
}
Remove (T) hace una llamada interna a RemoveAt (int) así, haciendo directamente una RemoveAt es más rápido.
Pero ¿qué quieres lograr?
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.
Gracias, ahora entiendo por qué MSDN dice que RemoveAt es O (n) donde n es Count-index – Yellowfog
Uso System.Diagnostics.Stopwatch()
Me hubiera acaba de crear una pequeña aplicación de consola para comprobar que es más rápido.
Dado que .Net infecta un vector (o matriz), no una lista vinculada, RemoveAt() es más rápido.
- 1. ¿Por qué es la lista <T> .IndexOf() mucho más rápida que la lista <T> .Contains()?
- 2. nuevo [] o nuevo Lista <T>?
- 3. ¿Es más rápido consultar una lista <T> o una base de datos?
- 4. C# Expandir lista plana <T> al diccionario <T, ICollection <int>>
- 5. lista <int> convertir a int []
- 6. Lista <?> o Lista <Object>
- 7. eliminar elementos de una lista genérica <t>
- 8. ¿El diccionario <TKey, TValue> es más rápido que LINQ en una lista <T>?
- 9. Lista de serialización <T> que contiene la lista <T>
- 10. Convierta 'ArrayList' en 'Lista <string>' (o 'Lista <T>') usando LINQ
- 11. Lo que está estático <T> Lista <T> methodName (Lista <? super T> entrada)
- 12. ¿Está bien para devolver una lista interna <T> como IEnumerable <T> o ICollection <T>?
- 13. Seleccione el método en la lista <t> Colección
- 14. Debe listar <T>. Quitar precedido con la lista <T>. ¿Existe?
- 15. IList <int> vs Lista <int>
- 16. ¿Cómo creo una lista <T> de una SortedList <int, T>?
- 17. más rápido Convertir de la colección a la lista <T>
- 18. SerializationBinder con la lista <T>
- 19. eliminar duplicados de una lista <int>
- 20. ¿Cuál es el beneficio de usar la Lista <T> sobre IEnumerable <T>?
- 21. ¿Qué es más eficiente: Lista <T> .Add() o System.Array.Resize()?
- 22. Cómo eliminar valores negativos de una lista <int>?
- 23. Lista <int> en C#
- 24. Elementos de conteo con int <5 en la lista <T>
- 25. Agregar la lista <t> .add() otra lista
- 26. cómo usar <T> .TryParse en un Método genérico mientras T es doble o Int
- 27. LINQ si regreso Lista <T> O IEnumerable <T> cuando todavía puede hacer más tarde
- 28. ¿Es posible deserializar XML en la lista <T>?
- 29. ¿Es la Lista.Encontrar <T> considerada peligrosa? ¿Cuál es una mejor manera de hacer la lista <T>. Find (Predicado <T>)?
- 30. que emiten es más rápido static_cast <int>() o int()
Pero si hace que su código sea peor o ilegible, podría seguir usando Remote (T). –
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