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