.NET 6’daki yenilikler [12]: PriorityQueue – Öncelik sırası

Womanne

Member
Yeni PriorityQueue sınıfı, bir FIFO öncelik listesi sağlar.


Sınıf System.Collections.Queue .NET Framework 1.0’dan (2001 yılı) beri mevcuttur; jenerik muadili System.Collections.Generic.Queue<Typ> .NET Framework 2.0’dan (2005 yılı).

.NET 6’da bu yıl sınıf System.Collections.Generic.PriorityQueue <Typ,Prio> Belirtilen önceliklere göre kuyruğa alınan girişleri yeniden teslim eden eklendi. En düşük öncelik değerine sahip olan öğe onu önce teslim eder.

kod

var pq = new PriorityQueue<string, int>();
pq.Enqueue("Christian", 3);
pq.Enqueue("Annalena", 2);
pq.Enqueue("Olaf", 1);
pq.Enqueue("Robert", 2);
pq.Enqueue("Armin", 4);
pq.Enqueue("Janine", 3);
pq.Enqueue("Susanne", 3);
while (pq.TryDequeue(out string name, out int prio))
{
Console.WriteLine($"Name: {name} - Prio: {prio}");
}

aşağıdaki çıktıyı verir:

Name: Olaf - Prio: 1
Name: Annalena - Prio: 2
Name: Robert - Prio: 2
Name: Christian - Prio: 3
Name: Janine - Prio: 3
Name: Susanne - Prio: 3
Name: Armin - Prio: 4

Bir bakalım: öncelikler aynıysa, kuyruğa girme sırası belirleyicidir. Bu, .NET 6 sürümünün belgelerinde yoktu, yalnızca 17 Kasım’da duyurulmuştu. katma. Ancak, tüm yeni .NET sınıflarının belgeleri, aşağıdakiler gibi eski .NET sınıflarına kıyasla seyrektir: Queue<Typ>.


Yeni sınıf hakkında biraz daha bilgi PriorityQueue GitHub’daki tartışmalarda bulunabilir. Orada, örneğin, kuyruk önceliklerini değiştiremeyeceğinizi ve yazamayacağınızı okuyabilirsiniz. IEnumerable uygulandı, yani ile değil foreach sayılabilir.

kim kesinlikle foreach bu uzantı yöntemini ekleyebilir:

public static class PriorityQueueExtensions
{
public static IEnumerable<TElement> GetEnumerator<TElement, TPriority>
(this PriorityQueue<TElement, TPriority> queue)
{
while (queue.TryDequeue(out var item, out TPriority priority))
yield return item;
}
}

O zaman şunu yazabilirsiniz:

foreach (var item in pq.GetEnumerator())
{
Console.WriteLine(item);
}


()





Haberin Sonu
 
Üst