Znaleźliśmy się z powrotem przez stary kod legacy ze starszej wersji 3.5 i znalazłem punkty, w których występuje całość pęczek list i słowników, które muszą być aktualizowane w zsynchronizowany sposób. Stwierdziłem, że mogę uczynić ten proces nieskończenie łatwiejszym zarówno do wykorzystania, jak i zrozumienia, poprzez zsumowanie tych niestandardowych klas nowych klas niestandardowych. Są jednak pewne punkty, w których doszedłem do obaw związanych z porządkowaniem zawartości tych nowych klas kontenerów za pomocą określonej właściwości wewnętrznej. Na przykład sortowanie według właściwości numeru ID jednej klasy.Narzędzie listy <T> .Sort() kontra Lista <T> .OrderBy() dla członka niestandardowej klasy kontenera
Ponieważ klasy kontenerów oparte są przede wszystkim na ogólnym obiekcie List, moim pierwszym instynktem było napisanie klas wewnętrznych za pomocą IComparable i napisanie metody CompareTo, która porównuje właściwości. W ten sposób mogę po prostu zadzwonić pod numer items.Sort()
, kiedy chcę wywołać sortowanie.
Zamiast tego zamiast tego zastanawiałem się zamiast używać items = items.OrderBy(Func)
. W ten sposób jest bardziej elastyczny, jeśli muszę sortować według dowolnej innej własności. Czytelność jest lepsza, ponieważ właściwość używana do sortowania będzie wyświetlana w kolejności z wywołaniem sortowania, zamiast konieczności wyszukiwania kodu IComparable. W rezultacie ogólna realizacja wydaje się czystsza.
Nie dbam o przedwczesną lub mikrooptymalizację, ale lubię konsystencję. Uważam, że najlepiej jest trzymać się jednego rodzaju implementacji w tylu przypadkach, ile jest to właściwe, i używać różnych implementacji tam, gdzie jest to konieczne. Czy warto przekonwertować mój kod, aby użyć LINQ OrderBy zamiast używać List.Sort? Czy lepszą praktyką jest pozostawanie przy implementacji IComparable dla tych niestandardowych kontenerów? Czy istnieją jakieś istotne mechaniczne korzyści oferowane przez którąkolwiek ścieżkę, którą powinienem rozważyć decyzję? Czy też ich funkcjonalność końcowa jest równoważna z tym, że po prostu staje się ona preferencją programisty?
Cóż, głośność wskazywana przez testy porównawcze mówi ... głośności.Przy takich stawkach mogę nawet wycisnąć 3 rodzaje, aby zastąpić ten jeden punkt, który użyłem 3 zespoły zamawiania, i uzyskać lepszą wydajność, niż gdybym użył tylko jednego OrderBy! Sortuj() to jest! –
Jedna szybka kontynuacja, sądząc po twoich obliczeniach ... czy oznaczałoby to również, że 'items.First()' jest znacznie wolniejsze niż 'items [0]'? –
Nie, 'First()' jest zoptymalizowane dla 'IList' implementacji i zwróci 'list [0]'. Spodziewam się, że wydajność będzie taka sama. Nawet jeśli bezpośrednio korzystał z wyliczenia, wciąż jest tylko jeden element do iteracji, więc prawdopodobnie będzie to mikrooptymalizacja. –