Pojawiło się pytanie, jak posortować listę. Podano kilka metod od podstawowego List.Sort() do List.OrderBy(). Najśmieszniejszy był roll-your-own-SelectionSort. Szybko przegłosowałem to, ale to mnie zastanowiło; czy nie zamawiałbyś Linby na OrderBy(), czy zrobił to samo? myList.OrderBy (x => x.Property) .ToList() tworzyłby iterator, który w zasadzie znajduje minimalną wartość projekcji w tym, co pozostało z kolekcji, a plon ją zwraca. Przechodząc przez całą listę, jest to sortowanie według wyboru.Wydajność wbudowanych sorterów kolekcji .NET
Który zmusił mnie do myślenia; jakie algorytmy używają wbudowane sortowniki dla list, sortowanych, pełnych itp. i czy należy ich unikać w przypadku dużych kolekcji? SortedList, ponieważ pozostaje posortowany według klucza, prawdopodobnie używałby jednoprzebiegowego InsertionSort przy każdym dodaniu; znajdź pierwszy indeks o wartości większej niż nowa i wstaw przed nim. Listy i tablice prawdopodobnie sprawiają, że MergeSort się dość sprawnie, ale nie znam rzeczywistego algorytmu za Sort(). Omówiliśmy OrderBy.
Co wiem powyżej, wydaje się wskazywać, że List.Sort() lub Array.Sort() są najlepszymi opcjami dla listy znanych rozmiarów, a używanie Linq do sortowania listy lub tablicy w pamięci powinno być zniechęcane . W przypadku strumienia, tak naprawdę nie ma innego sposobu niż OrderBy() przeliczalny; Utrata wydajności jest łagodzona przez fakt, że można przechowywać dane w postaci strumienia zamiast konieczności posiadania wszystkiego przed sortowaniem.
EDIT:
Ogólny konsensus jest, że Sort() jest szybsza podano konkretną implementację listy lub macierzy. OrderBy jest rozsądny, ale wolniejszy, ponieważ dodaje O (N) złożoność wyodrębniania tablicy z przejętego przelicznika. Inicjalizacja SortedList kończy się jako O (N^2) z powodu tego, co znajduje się pod maską. Morał z tej historii, użyj List.Sort() zamiast List.OrderBy(), gdy masz prawdziwą listę.
Myślę, że większość wbudowanych sortowań używa szybkiego sortowania. Jeśli chcesz przyspieszyć, usuń sprawdzanie granic. List.Sort również wewnętrznie używa Array.Sort. –
@Mikael jest poprawny, OrderBy() również używa szybkiego sortowania. @KeithS, możesz szczęśliwie przeglądać kod źródłowy sam, jest on publicznie dostępny (i zintegrowany z VS). EnumerableSorter.QuickSort to nazwa metody, której używa OrderBy. –
.Net Reflector ponownie na ratunek - muszę to pokochać! –