因此,首先我們需要實施優先級隊列。這是我不久前寫的一個。這可能不是理想的;它有一個很小的API,它可能會表現得更好,但它是一個足夠的起點:包裝,當
public class PriorityQueue<TPriority, TElement>
{
SortedDictionary<TPriority, Queue<TElement>> dictionary = new SortedDictionary<TPriority, Queue<TElement>>();
public PriorityQueue()
{
}
public Tuple<TPriority, TElement> Peek()
{
var firstPair = dictionary.First();
return Tuple.Create(firstPair.Key, firstPair.Value.First());
}
public TElement Pop()
{
var firstPair = dictionary.First();
TElement output = firstPair.Value.Dequeue();
if (!firstPair.Value.Any())
dictionary.Remove(firstPair.Key);
return output;
}
public void Push(TPriority priority, TElement element)
{
Queue<TElement> queue;
if (dictionary.TryGetValue(priority, out queue))
{
queue.Enqueue(element);
}
else
{
var newQueue = new Queue<TElement>();
newQueue.Enqueue(element);
dictionary.Add(priority, newQueue);
}
}
}
延遲隊列很簡單:
public class DelayQueue<T>
{
private PriorityQueue<DateTime, T> queue = new PriorityQueue<DateTime, T>();
public void Enqueue(T item, int delay)
{
queue.Push(DateTime.Now.AddMilliseconds(delay), item);
}
public T Dequeue()
{
if (queue.Peek().Item1 > DateTime.Now)
return queue.Pop();
else
return default(T);
}
}
請出示一些源代碼..你有什麼嘗試?什麼不工作/你卡在哪裏? – Yahia
如果你有一個Java實現,它不應該太難轉換爲C#。甚至可能比從頭開始寫自己更容易。 – Servy
延遲隊列的C#實現將類似於Java實現。 –