私は、ConcurrentQueue<T>
渡された最後の N 個のオブジェクト (履歴のようなもの) を保持することを目的とした共有データ構造に使用しています。
ブラウザがあり、最後に閲覧した 100 件の URL を取得したいとします。容量がいっぱいになったとき (履歴に 100 件のアドレス)、新しいエントリが挿入 (エンキュー) されると、最も古い (最初の) エントリを自動的に削除 (デキュー) するキューが必要です。
どうすればそれを実現できますかSystem.Collections
?
ベストアンサー1
Enqueue 時に Count をチェックし、カウントが制限を超えたら Dequeue するラッパー クラスを作成します。
public class FixedSizedQueue<T>
{
readonly ConcurrentQueue<T> q = new ConcurrentQueue<T>();
private object lockObject = new object();
public int Limit { get; set; }
public void Enqueue(T obj)
{
q.Enqueue(obj);
lock (lockObject)
{
T overflow;
while (q.Count > Limit && q.TryDequeue(out overflow)) ;
}
}
}