.NET 6 wprowadza nowy typ kolekcji, PriorityQueue, który, jak sama nazwa wskazuje, dodaje wsparcie dla priorytetów oprócz zwykłej kolejki. Uwaga: JestBezpieczna dla gwintów, musisz zwracać uwagę na kwestie bezpieczeństwa wątków.
Źródło:Logowanie do linku jest widoczne.
Rozpocząć
Przyjrzyjmy się prostemu przykładowi użycia:
Przykładowe wyjście:
Widać, że kolejność wyjść jest odwrotna do kolejności, którą dodaliśmy. PriorytetyQueue zaczyna się od najmniejszego priorytetu podczas dequeue, im mniejsza wartość, tym wyższy priorytet, tym wyższy priorytet, wyższy priorytet, tym wyższy priorytet, tym większy priorytet, tym większy priorytet wyjścia, jeśli chcemy najpierw maksymalny wynik, czy to w porządku? Odpowiedź brzmi tak, ale musimy określić własne reguły porównania priorytetów, możesz odnieść się do następującego przykładu
Sceny
Dzięki automatycznemu sortowaniu z priorytetem możemy rozważyć użycie PriorityQueue, gdy potrzebujemy automatycznego sortowania
Kolejka wiadomości
Dzięki PriorityQueue można zaimplementować kolejkę wiadomości priorytetowych, pozwalającą użytkownikom określić priorytet wiadomości podczas wysyłania wiadomości, a podczas jej konsumowania będzie ona priorytetowana.
W powyższym przykładzie domyślnie określamy int jako typ Priorytetu i łączymy niektóre wiadomości z kolejką, ale często jest wiele wiadomości i mogą wystąpić sytuacje o tym samym priorytecie, które możemy wykorzystaćCzas i inteligencja jako federowany typ priorytetuMożesz odnieść się do następującego przykładu:
Przykładem wyjścia jest następujący:
Z powyższych wyników wynika, że w przypadku priorytetu najpierw przetwarzamy wiadomości w krótszym czasie, albo możemy dostosować metodę sortowania do własnych potrzeb oraz dostosować logikę porównania priorytetów.
Ranga
PriorytetyQueue może być również wykorzystywana w wielu aplikacjach rankingowych, takich jak ranking wyników uczniów
Spójrz na przykładowy kod poniżej:
Powyższa lista to lista ocen, wystarczy zapisać kilka danych testowych, dzięki UnorderedItems w PriorityQueue możemy pobrać dane przed sortowaniem, a także jest to kolejność dołączania do kolejki (Enqueue), domyślne porównanie to najpierw małe (czyli najniższy wynik, a następnie chcemy posortować od największego do najmniejszego, musimy dostosować metodę porównania).
Powyższy High2LowComparer to niestandardowe porównanie, które jest w rzeczywistości odwrotnością wyniku porównania, a kod wygląda następująco:
Powyższy wynik wygląda następująco:
Więcej
W Redis istnieje typ danych zset(sortedSet), które potrafią robić podobne rzeczy, ale nadal istnieją pewne różnice między zset a PriorityQueue – zset to zset, czyli kolekcja, która automatycznie się deduplikuje, podczas gdy PriorityQueue nadal jest kolejką i nie zostanie deduplikowany, zset może modyfikować priorytet (wynik) odpowiadającego elementu, ale PriorityQueue Obecnie nie jest obsługiwana modyfikacja odpowiadającego priorytetu elementu
PriorityQueue może rozwiązać niektóre nasze problemy, ale warto pamiętać o kilku rzeczach podczas korzystania z niego:
- Po pierwsze, jeśli priorytet jest ten sam, kolejność wyjścia może być inna, co jest określane przez wewnętrzny algorytm implementacyjny, a kolejność nie może być ściśle gwarantowana
- PriorytetyQueue nie jest bezpieczna dla wątków, a problemy z bezpieczeństwem wątków należy zwrócić uwagę
- Metoda Peek w PriorityQueue pobiera tylko nadchodzący element w kolejce, ale nie usuwa go z kolejki
(Koniec) |