.NET 6 introduce un nuevo tipo de colección, PriorityQueue, que, como su nombre indica, añade soporte de prioridad sobre la cola ordinaria. Nota: Él esNo seguro para roscas, debes prestar atención a los problemas de seguridad de la rosca.
Fuente:El inicio de sesión del hipervínculo es visible.
Comenzar
Veamos un ejemplo sencillo de uso:
Ejemplo de salida:
Puedes ver que el orden de salida es opuesto al orden que añadimos, PriorityQueue comienza con la prioridad más baja al descolar, cuanto menor es el valor, mayor es la prioridad, mayor es la prioridad, mayor es la prioridad, más prioridad es la salida, si queremos la salida máxima, ¿está bien? La respuesta es sí, pero necesitamos especificar nuestras propias reglas de comparación de prioridades, puedes consultar el siguiente ejemplo
Escenas
Con el autoordenamiento con prioridad, podemos considerar usar PriorityQueue cuando necesitemos hacer auto-ordenamiento
Cola de mensajes
Con PriorityQueue, se puede implementar una cola de mensajes de prioridad, permitiendo a los usuarios especificar la prioridad de un mensaje al enviarlo, y se priorizará al consumirlo.
En el ejemplo anterior, especificamos un int como tipo de Prioridad por defecto y fusionamos algunos mensajes en la cola, pero a menudo hay muchos mensajes y puede haber situaciones con la misma prioridad, que podemos usarTiempo e INT como un tipo de prioridad federadaPuedes consultar el siguiente ejemplo:
Un ejemplo de la salida es el siguiente:
A partir de los resultados anteriores, se puede ver que en el caso de prioridad, primero procesaremos los mensajes con menos tiempo, o podemos personalizar el método de ordenación según nuestras propias necesidades y la lógica de comparación de prioridades.
Rango
PriorityQueue también puede usarse en muchas aplicaciones de clasificación, como una clasificación del rendimiento estudiantil
Echa un vistazo al código de ejemplo a continuación:
La lista anterior es una lista de calificaciones, solo hay que escribir unos pocos datos de prueba, a través de UnorderedItems de PriorityQueue podemos obtener los datos antes de ordenar, y también es el orden en que nos unimos a la cola (Enqueue), la comparación por defecto es la pequeña primero, es decir, la puntuación más baja es la primera, luego queremos ordenar de mayor a menor necesitamos personalizar el método de comparación.
El High2LowComparer anterior es una comparación personalizada, que en realidad es un inverso del resultado de la comparación, y el código es el siguiente:
La salida anterior es la siguiente:
Más
Existe un tipo de datos zset (sortedSet) en Redis que puede hacer cosas similares, pero aún existen algunas diferencias entre zset y PriorityQueue, zset es un set, una colección que se deduplica automáticamente, mientras que PriorityQueue sigue siendo una Queue no se deduplicará, zset puede modificar la prioridad (puntuación) del elemento correspondiente, pero PriorityQueue Actualmente, no se permite modificar la prioridad correspondiente de un elemento
PriorityQueue puede resolver algunos de nuestros problemas, pero hay algunas cosas que hay que tener en cuenta al usarla:
- En primer lugar, si la prioridad es la misma, el orden de la salida puede ser diferente, lo cual está determinado por su algoritmo interno de implementación, y el orden no puede garantizarse estrictamente
- PriorityQueue no es seguro para hilos, y hay que señalar los problemas seguros para hilos
- El método Peek en PriorityQueue solo recuperará el elemento siguiente en la cola, pero no lo eliminará de la cola
(Fin) |