Puha, nu synes jeg alligevel det blev en smule svært at finde en vinder. Jeg har modtaget en del forslag til hvordan opgaven kan løses og størstedelen af dem er rimlig ens.
Mange af jer har brugt Queue typen i jeres egen type og det er sådan set cool nok, men se f.eks dette eksempel fra Rasmus Bjerner som 1. ikke bruger den 2. har rigtig lidt kode.
public class PriorityQueue<T>
{
private struct Data { public T t; public int priority; }
private readonly List<Data> list = new List<Data>();
public void InsertWithPriority(T element, int priority)
{
list.Insert(list.
Where(x => x.priority >= priority).Count(),
new Data { t = element, priority = priority });
}
public T GetNext()
{
if (list.Count > 0)
{
T t = list[0].t;
list.RemoveAt(0);
return t;
}
return default(T);
}
public T PeekAtNext()
{
return list.Count > 0 ? list[0].t : default(T);
}
}
Jeg synes ovenstående er elegant kode, let læseligt og overskueligt. Det eneste minus i denne kode er at priorteten skal være en integer.
En anden som har bidraget med noget næsten ligeså lækkert kode og lidt mere generisk er Allan Hvam Petersen. Se selv.
public class PriorityQueue<TItem, TPriority> : SortedList<TPriority, Queue<TItem>>
{
public TItem PeekAtNext()
{
return this.Last().Value.Peek();
}
public TItem GetNext()
{
var queue = this.Last().Value;
var item = queue.Dequeue();
if (queue.Count() == 0)
{
Remove(this.Last().Key);
}
return item;
}
public void InsertWithPriority(TItem item, TPriority priority)
{
if (ContainsKey(priority))
{
this[priority].Enqueue(item);
}
else
{
Add(priority, new Queue<TItem>(new[] { item }));
}
}
}
Jeg synes den her skal gå til Allan, selvom der var meget lækkert kode fra jer allesammen, synes jeg alligevel der var noget federe over Allans bud.
Der er et programmeringskit på vej til dig! Tillykke.
I kan finde koden fra lågen her.