C#列出项目有TTL的位置

时间:2011-09-15 18:43:29

标签: c# data-structures

为了一个简单的例子,我想要一个字符串列表。列表中的每个项目应在将其添加到列表后5分钟“过期”。虽然可能没有一种简单的内置方法可以做到这一点,但我想最终得到一个数据结构,其API感觉就像“正常工作”。

您可以按如下方式使用它:

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"]

最终列表应为空。

2 个答案:

答案 0 :(得分:24)

您可以使用.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列表,但您可以根据您的解决方案进行调整,而不需要自己实现缓存过期。

答案 1 :(得分:0)

您应该能够使用SortedDictionary<DateTime, ...>和自定义IComparer<DateTime>来“反转”字典的顺序,以便最早的元素排在第一位。在从字典中返回元素之前,只需删除太旧的前N个元素。

当然,当调用者期待简单的读取时,修改“隐藏”下的集合可能会导致多线程环境中的问题,但这是一个不同的主题...