class ConflatingQueue<TKey, TValue> : IEnumerable<TValue>
{
private readonly Dictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>();
private readonly Queue<TKey> keys = new Queue<TKey>();
public void Enqueue(TKey key, TValue value)
{
if (dict.ContainsKey(key))
{
dict[key] = value;
}
else
{
dict.Add(key, value);
keys.Enqueue(key);
}
}
public TValue Dequeue()
{
var key = keys.Dequeue();
var value = dict[key];
dict.Remove(key);
return value;
}
public IEnumerator<TValue> GetEnumerator()
{
foreach (var key in keys)
{
yield return dict[key];
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
哪位能像這樣被使用:
public static void Main(string[] args)
{
//A -> B1 -> C -> B2 -> B1
var cq = new ConflatingQueue<string, string>();
cq.Enqueue("A", "A");
cq.Enqueue("B1", "B1");
cq.Enqueue("C", "C");
cq.Enqueue("B2", "B2");
cq.Enqueue("B1", "B1");
Console.WriteLine(string.Join(",", cq)); //A,B1,C,B2
}
我會離開使得多線程作爲一個練習留給讀者。
你需要先進先出嗎? – Robert
是的,我需要先進先出。 – Andrew
如果您只希望執行最後一個B1事件,您是否願意承擔從未處理過的B1事件?你想如何處理B1事件會不斷推回的可能性? – Robert