Novidades no .NET 6 e C# 10: PriorityQueue

Este é o segundo artigo de uma série focada nas novidades do .NET 6 e C# 10.

Artigos da série

Minimal APIs

Eu sei que é difícil se manter atualizado com novas versões sendo lançadas, e que é frustrante se sentir desatualizado enquanto tanta coisa nova vem aparecendo.

Por essa razão decidi escrever esta série. Os artigos vão ser breves e objetivos.

Então, vamos lá?


PriorityQueue

Antes de falar sobre a PriorityQueue, é essencial entender como a Queue funciona, que é a implementação da estrutura de dados Fila em .NET. Indico ler este meu artigo para se familiarizar com ela.

Sobre a PriorityQueue, cada elemento que é enfileirado sendo associado a uma prioridade, que vai determinar a ordem de remoção. Existem dois pontos bem importantes de serem apresentados:

  • O elemento de menor prioridade vai ser removido antes
  • Este tipo não garante a ordenação FIFO da Queue tradicional (honestamente, eu acho BEM estranho isso), considerando itens com a mesma prioridade sendo adicionados. Ou seja, é garantido que os elementos de menor prioridade vão ser removidos, mas NÃO garante que os que foram inseridos primeiro serão removidos primeiro. Ou seja, para uma fila tradicional de atendimento médico, por exemplo, onde a remoção utilizando prioridade mas seguindo uma ordem de chegada não parece ser um caso de uso desse tipo. Mas existe uma alternativa ao utilizar o valor da prioridade!

Operações

As principais operações de um PriorityQueue são:

  • Enqueue(Element, Priority): adiciona o valor do elemento e a sua prioridade correspondente
  • Dequeue: remove o próximo registro da fila e o retorna
  • Peek(): retorna o próximo registro sem removê-lo da fila

Exemplo

Abaixo eu mostro um exemplo de seu uso. A ideia é permitir gerenciar senhas geradas para fila de atendimento utilizando prioridade. Mas pera, eu acabei de falar acima que ela não garante a sequência de registros de mesma prioridade utilizando FIFO (First-in First-Out)! Porém, existe uma “manobra” utilizando uma prioridade de tipo cadeia de caracteres ao invés de numérico.

var priorityQueue = new PriorityQueue<string, string>();

var countPriority = 1;
var countSimple = 1;

priorityQueue.Enqueue($"S{countSimple++}", $"S{countSimple}");
priorityQueue.Enqueue($"P{countPriority++}", $"P{countPriority}");
priorityQueue.Enqueue($"S{countSimple++}", $"S{countSimple}");
priorityQueue.Enqueue($"P{countPriority++}", $"P{countPriority}");
priorityQueue.Enqueue($"S{countSimple++}", $"S{countSimple}");
priorityQueue.Enqueue($"P{countPriority++}", $"P{countPriority}");

// Começar a chamar a fila
while (priorityQueue.Count > 0)
{
    var next = priorityQueue.Dequeue();

    Console.WriteLine($"Próxima ficha: {next}");
}

Console.ReadLine();

Com isso, a ordenação é realizada utilizando uma prioridade de tipo string, então o S (Simple) sempre vai ser chamado após o P (Priority), garantindo a ordem correta. A saída desse código é mostrada abaixo.

Saída do código acima

O que achou? Curtiu essa novidade?


Inscreva-se na lista de espera do Método .NET Direto ao Ponto, um treinamento completo sobre C#, APIs com ASP.NET Core, Microsserviços e mais:  Inscreva-se aqui.

São mais de 450 vídeo-aulas sobre temas como C#, ASP NET Core, EF Core, CQRS, Clean Architecture, Autenticação e autorização com JWT, Testes Unitários, HTML, CSS, JavaScript, Desenvolvimento Front-End com Angular além de mini-cursos em Microsserviços, Performance em .NET, ASP NET Core e Azure, Docker, Carreira Internacional em .NET, e mais. Cursos com certificado em plataforma moderna, e novas aulas são adicionadas semanalmente!

Conclusão

Foi abordado neste artigo a funcionalidade da PriorityQueue, tipo introduzido com o lançamento do .NET 6.

Se curtiu a leitura, compartilha com os amigos e/ou nas redes sociais