Czy jest szybsza metoda List<T>.Remove(T)
lub List<T>.RemoveAt(int)
w kolekcjach .NET? Czy prędkość różni się dla typów wartości lub typów odniesienia?Czy jest to szybsze niż metoda <T> .Usuń (T) lub Lista <T> .RemoveAt (int)?
Odpowiedz
List.Remove (T) używa IndexOf i RemoveAt (int) w swojej implementacji. Tak List.RemoveAt (int) jest szybszy.
public bool Remove(T item)
{
int index = this.IndexOf(item);
if (index >= 0)
{
this.RemoveAt(index);
return true;
}
return false;
}
Remove (T) sprawia, że wewnętrznie wezwanie do RemoveAt (int) Więc robi bezpośrednio RemoveAt jest szybsze.
Ale co chcesz osiągnąć?
Prosta odpowiedź:
Ogólnie RemoveAt
jest szybsza, choć nie zawsze ogromnie.
Długa odpowiedź:
Miejmy tylko rozważyć znalezienie pierwszy element jest właściwa. Metoda Remove
musi przeszukiwać listę dla elementu, który pasuje do danego obiektu, a zatem ogólnie czas jest O(n)
. RemoveAt
na liście może po prostu zindeksować dany element, a zatem jest O(1)
.
Teraz usunięcie elementu z końca listy to oczywiście O(1)
, ale generalnie usunięcie przedmiotu zajmuje czas O(n)
, ponieważ należy przeprowadzić przetasowanie (przenoszenie przedmiotów po usuniętym do przodu). Dlatego w ogólnym przypadku całkowita złożoność czasu dla usunięcia wynosi odpowiednio O(n) + O(n)
lub O(n) + O(1)
dla Remove and RemoveAt, a zatem po prostu O(n)
w obu przypadkach. Jednakże, gwarantowane jest, że RemoveAt
jest co najmniej tak szybki, chociaż skalowanie jest takie samo, chyba że wiesz, że usuwasz je w/blisko końca.
Dzięki, teraz rozumiem, dlaczego MSDN mówi, że RemoveAt to O (n), gdzie n to Count-index – Yellowfog
Zastosowanie System.Diagnostics.Stopwatch()
bym właśnie stworzyliśmy małą aplikację konsoli, aby sprawdzić, które jest szybsze.
Biorąc pod uwagę, że .Net infekuje wektor (lub tablicę), a nie listę połączoną, metoda RemoveAt() jest szybsza.
- 1. Dlaczego lista <T> .IndexOf() jest dużo szybsza niż lista <T> .Contains()?
- 2. Lista <T> jest wyczyszczona problem
- 3. metoda, która przyjmuje zarówno int [] i Lista <int>
- 4. Kolejka <T> vs Lista <T>
- 5. IList <int> vs Lista <int>
- 6. Co jest statyczna <T> Lista <T> methodName (Lista <? super T> wejście)
- 7. Lista <T> wdrożyć IQueryable <T>
- 8. Lista <T> - czy przekazuję obiekty lub referencje?
- 9. Dlaczego należy używać IQueryable <T> ponad Lista <T> w LINQ to SQL
- 10. Sprawdź int lub listę <int>
- 11. Czy została usunięta lista dla metody <T> .ForEach()?
- 12. Lista <T> nie jest równa listy <T>?
- 13. Lista <int> w C#
- 14. Błąd z T :: iteratorem, gdzie parametr szablonu T może być wektorem <int> lub listą <int>
- 15. unique_ptr <int[]> lub wektor <int>?
- 16. Różnice pomiędzy `kopii (listy <? super T> dest, List <? extends T> src)` i `kopiowania (Lista <T> dest, List <? extends T> src)`
- 17. Lista <int> do IEnumerable <IComparable>
- 18. Fill Lista <int> użyciu LINQ
- 19. Lazy <T> metoda reinicjalizacji?
- 20. Lista wyrażeń <Func <T, TProperty >>
- 21. C# Lista <T> vs pytanie IEnumerable <T> wydajności
- 22. Dlaczego lista <T> jest nieważna na interfejsie kowariancyjnym MyInterface <out T>
- 23. Lista niestandardowa (pochodna) <T>
- 24. C# Lista <T> Zawiera test
- 25. convert <vector><string> TO <vector><int> C++, Win32
- 26. Jak działa ObservableCollection <T> .Move (int, int)?
- 27. IList <T> .FindIndex (Int32, Predicate <T>)
- 28. return unknown Lista ogólna <T>
- 29. IList <T> vs IEnumerable <T>. Co jest bardziej skuteczne IList <T> lub IEnumerable <T>
- 30. Czy lista <T> wątkowa do odczytu?
Ale jeśli sprawi, że twój kod będzie najgorszy lub nieczytelny, równie dobrze może nadal używać Remote (T). –
'this.IndexOf (item)' kod ma ogromną cenę pod względem wydajności, ponieważ skanuje całą tablicę backingową, dopóki nie zostanie usunięty element. Zwłaszcza gdy element do usunięcia znajduje się na końcu listy, skanuje całą listę za każdym razem, gdy żądane jest usunięcie. Stało się to ze mną, gdy próbowałem zaimplementować strukturę danych stosu za pomocą klasy 'List'. Ponieważ rozmiar listy znacznie rośnie, np. poza elementami 10K, usunięcie z końca za pomocą Remove (T) może zniszczyć twój program. –
RBT