1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace MyNameSpace
6{
7 public class QueueDictionary<TKey, TValue> : Dictionary<TKey, TValue>
8 {
9 private Queue<TKey> innerQueue = new Queue<TKey>();
10 private object padlock = new object();
11
12 public QueueDictionary()
13 : base()
14 {
15 }
16
17 new public void Add(TKey key, TValue value)
18 {
19 lock (padlock)
20 {
21 base.Add(key, value);
22 innerQueue.Enqueue(key);
23 }
24 }
25
26 new public bool Remove(TKey key)
27 {
28 lock (padlock)
29 {
30 return base.Remove(key);
31 }
32 }
33
34 public TValue Peek()
35 {
36 lock (padlock)
37 {
38 if (innerQueue.Count == 0)
39 return default(TValue);
40
41 TKey key = innerQueue.Peek();
42 while (innerQueue.Count > 0 && !base.ContainsKey(key))
43 {
44 innerQueue.Dequeue();
45 key = innerQueue.Peek();
46 }
47
48 return base.ContainsKey(key) ? base[key] : default(TValue);
49 }
50 }
51
52 public TValue Dequeue()
53 {
54 lock (padlock)
55 {
56 if (innerQueue.Count == 0)
57 return default(TValue);
58
59 TKey key = innerQueue.Dequeue();
60 while (innerQueue.Count > 0 && !base.ContainsKey(key))
61 {
62 key = innerQueue.Dequeue();
63 }
64
65 if (base.ContainsKey(key))
66 {
67 TValue ret = base[key];
68 base.Remove(key);
69 return ret;
70 }
71 else
72 {
73 return default(TValue);
74 }
75 }
76 }
77 }
78
79}
80