2011-09-15 11 views
7

簡単な例として、私は文字列のリストを持っていたいと思います。リスト内の各項目は、リストに追加してから5分後に「期限切れになる」必要があります。これを行う簡単で組み込みの方法はないかもしれませんが、私はAPIが "うまくいく"のように感じるデータ構造にしたいと思います。C#リストに項目がTTLを持つ

次のようにあなたがそれを使用する可能性があります:

var now = DateTime.now(); 
var list = new ListWithTTL<string>(); 
list.add("Bob", now); 
list.add("Joe", now.AddMinutes(1)); 
list.add("Tom", now.AddMinutes(2)); 
list.add("Tim", now.AddMinutes(2)); 

をすぐに要素の検査は

["Bob", "Joe", "Tom", "Tim"] 

数分後には

["Tom", "Tim"] 

を得なければならない最終的にリストが空でなければなりませんもたらすであろう。

+1

あなたの質問は何ですか? –

+0

実装のアイデアを探しています。 – Larsenal

答えて

23

.NET 4でMemoryCacheクラスを使用すると、アイテムを追加するときにTTLを指定できます。

簡単な例:

MemoryCache cache = new MemoryCache("foo"); 
cache.Add("bar", "baz", DateTime.Now.AddSeconds(5)); 
var bar = cache["bar"];//returns "baz" 
Thread.Sleep(TimeSpan.FromSeconds(6)); 
var expired = cache["bar"]; //returns null 

あなたは、あなたのソリューションのためのキャッシュの有効期限を自分で実装する必要がこれを適応させることができなかったTTLリストに直接ご提供していないが。

+0

ああ、私はそれについて知りませんでした...はるかに良い+1 –

+0

+1これは私が毎日stackoverflowを読む理由です。ものを学ぶ。 –

+0

@BrokenGlassアイテムはTTLの有効期限が切れる前に 'MemoryCache' **から追い出されますか?例えば、 'MemoryCache.CacheMemoryLimit'に達するとどうなりますか? –

0

SortedDictionary<DateTime, ...>とカスタムIComparer<DateTime>を使用すると、最も古い要素が最初に来るように辞書の順序を「逆転」することができます。辞書から要素を返す前に、古すぎる最初のN要素を削除するだけです。呼び出し側は単純な読み取りがマルチスレッド環境での問題につながる可能性が期待しているが、これは別のトピックであるとき、「アンダーカバー」のコレクションを変更するもちろん

、...

関連する問題