.NET 6 introduce un nuovo tipo di collezione, PriorityQueue, che, come suggerisce il nome, aggiunge il supporto prioritario sopra la normale Queue. Nota: Lo èNon sicuro per filettature, devi prestare attenzione alle questioni di sicurezza del filo.
Fonte:Il login del link ipertestuale è visibile.
Inizia
Diamo un'occhiata a un esempio semplice di utilizzo:
Esempio di output:
Puoi vedere che l'ordine dell'output è opposto a quello che abbiamo aggiunto: PriorityQueue inizia con la priorità minima quando si dequeue, più piccolo è il valore, più alta è la priorità, più alta è la priorità, più alta è la priorità, più alta è l'output, se vogliamo prima l'output massimo, va bene? La risposta è sì, ma dobbiamo specificare le nostre regole di confronto delle priorità, puoi fare riferimento al seguente esempio
Scene
Con l'auto-ordinamento con priorità, possiamo considerare l'uso di PriorityQueue quando serve un po' di auto-ordinamento
Coda di messaggi
Con PriorityQueue, può essere implementata una coda di messaggi prioritari, permettendo agli utenti di specificare la priorità di un messaggio durante l'invio di un messaggio, e questa sarà prioritizzata durante il consumo.
Nell'esempio sopra, specifichiamo un int come tipo di Priorità di default e uniamo alcuni messaggi nella coda, ma spesso ci sono molti messaggi e possono esserci situazioni con la stessa priorità, che possiamo usaretempo e intelligenza come tipo di priorità federataPuoi fare riferimento al seguente esempio:
Un esempio di output è il seguente:
Dai risultati sopra descritti, si può vedere che, nel caso della priorità, prima elaboreremo i messaggi con meno tempo, oppure possiamo personalizzare il metodo di ordinamento secondo le nostre esigenze e la logica di confronto delle priorità.
Rango
PriorityQueue può essere utilizzato anche in molte applicazioni di classificazione, come una classificazione delle prestazioni degli studenti
Dai un'occhiata al codice di esempio qui sotto:
La lista sopra è una lista di voti, basta scrivere qualche dato di test, tramite UnorderedItems di PriorityQueue possiamo ottenere i dati prima di ordinare, ed è anche l'ordine in cui entriamo nella coda (Enqueue), il confronto predefinito è il piccolo, cioè il punteggio più basso è il primo, poi vogliamo ordinare dal più grande al più piccolo per personalizzare il metodo di confronto.
L'High2LowComparer sopra è un confronto personalizzato, che in realtà è un inverso del risultato del confronto, e il codice è il seguente:
L'output sopra è il seguente:
Più
Esiste un tipo di dati zset (sortedSet) in Redis che può fare cose simili, ma ci sono ancora alcune differenze tra zset e PriorityQueue, zset è un set, una collezione che deduplica automaticamente, mentre PriorityQueue è comunque una Queue non verrà deduplicata, zset può modificare la priorità (punteggio) dell'elemento corrispondente, ma PriorityQueue Attualmente, non è supportato modificare la corrispondente priorità di un elemento
PriorityQueue può risolvere alcuni dei nostri problemi, ma ci sono alcune cose da tenere a mente quando lo si usa:
- Innanzitutto, se la priorità è la stessa, l'ordine dell'output può essere diverso, determinato dal suo algoritmo interno di implementazione, e l'ordine non può essere strettamente garantito
- PriorityQueue non è thread-safe, e i problemi thread-safe devono essere segnalati
- Il metodo Peek in PriorityQueue recupererà solo l'elemento successivo nella coda, ma non lo rimuoverà dalla coda
(Fine) |