O .NET 6 introduz um novo tipo de coleção, PriorityQueue, que, como o nome sugere, adiciona suporte a prioridades sobre a Queue comum. Nota: Ele éNão seguro para rosca, você precisa prestar atenção às questões de segurança da rosca.
Fonte:O login do hiperlink está visível.
Começar
Vamos dar uma olhada em um exemplo simples de uso:
Exemplo de saída:
Você pode ver que a ordem da saída é oposta à ordem que adicionamos, a PriorityQueue começa com a menor prioridade ao ser desenfilada, quanto menor o valor, maior a prioridade, maior a prioridade, maior a prioridade, maior a prioridade, maior a prioridade da saída, se quisermos a saída máxima primeiro, está tudo bem? A resposta é sim, mas precisamos especificar nossas próprias regras de comparação de prioridades, você pode se referir ao seguinte exemplo
Cenas
Com a ordenação automática com prioridade, podemos considerar usar a PriorityQueue quando precisarmos fazer uma auto-ordenação
Fila de Mensagens
Com o PriorityQueue, uma fila de mensagens prioritárias pode ser implementada, permitindo que os usuários especifiquem a prioridade de uma mensagem ao enviar uma mensagem, e ela será priorizada ao consumir.
No exemplo acima, especificamos um int como o tipo de Prioridade por padrão, e mesclamos algumas mensagens na fila, mas geralmente há muitas mensagens, e podem existir situações com a mesma prioridade, que podemos usarTempo e INT como um tipo de prioridade federadaVocê pode se referir ao seguinte exemplo:
Um exemplo da saída é o seguinte:
A partir dos resultados acima, pode-se ver que, no caso da prioridade, primeiro processaremos as mensagens com menos tempo, ou podemos personalizar o método de ordenação de acordo com nossas próprias necessidades e personalizar a lógica de comparação de prioridades.
Classificar
O PriorityQueue também pode ser usado em muitos aplicativos de ranking, como uma classificação do desempenho dos alunos
Dê uma olhada no código de exemplo abaixo:
A lista acima é uma lista de notas, basta escrever alguns dados de teste, através do UnorderedItems do PriorityQueue podemos obter os dados antes de ordenar, e também é a ordem em que entramos na fila (Enqueue), a comparação padrão é a pequena primeiro, ou seja, a pontuação mais baixa é a primeira, depois queremos ordenar do maior para o menor precisamos personalizar o método de comparação.
O High2LowComparer acima é uma comparação personalizada, que na verdade é uma inversa do resultado da comparação, e o código é o seguinte:
A saída acima é a seguinte:
Mais
Existe um tipo de dado zset (sortedSet) no Redis que pode fazer coisas semelhantes, mas ainda existem algumas diferenças entre zset e PriorityQueue, zset é um conjunto, uma coleção que se desduplica automaticamente, enquanto PriorityQueue ainda é uma Queue não será desduplicada, zset pode modificar a prioridade (score) do elemento correspondente, mas PriorityQueue Atualmente, não é suportado modificar a prioridade correspondente de um elemento
O PriorityQueue pode resolver alguns dos nossos problemas, mas há algumas coisas para ter em mente ao usá-lo:
- Primeiramente, se a prioridade for a mesma, a ordem da saída pode ser diferente, o que é determinado pelo algoritmo interno de implementação, e a ordem não pode ser estritamente garantida
- O PriorityQueue não é seguro para threads, e questões seguras para threads precisam ser observadas
- O método Peek no PriorityQueue só vai buscar o elemento seguinte na fila, mas não o remove da fila
(Fim) |