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?


Quer alavancar sua carreira como Desenvolvedor(a) .NET?

Opa, aqui é o Luis Felipe (LuisDev), criador do blog LuisDev.

Além de Desenvolvedor .NET Sênior, eu sou instrutor de mais de 700 alunos e também tenho dezenas de mentorados.

Conheça o com mais de 800 video-aulas sobre C# e desenvolvimento de APIs com ASP NET Core, Microsserviços com ASP NET Core, Arquitetura de Software, Computação em Nuvem, SQL, HTML, CSS e JavaScript, JavaScript Intermediário, TypeScript, Desenvolvimento Front-End com Angular, e Desenvolvimento Front-end com React. Diversos mini-cursos disponíveis aos alunos e atualizações gratuitas.

Suporte dedicado, e comunidade de centenas de alunos.

Completo e online, destinado a profissionais que querem dar seu próximo passo em sua carreira como desenvolvedores .NET.

Clique aqui para ter mais informações e garantir sua vaga

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