C#列出项目具有TTL的位置

C#列出项目具有TTL的位置,c#,data-structures,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("To

为了一个简单的例子,我想要一个字符串列表。列表中的每个项目应在添加到列表中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"]
最后列表应该是空的。

您可以使用.NET 4中的类,该类允许您在添加项目时指定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列表,但您可以根据您的解决方案对其进行调整,无需自行实现缓存过期。

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


当然,当调用方希望进行简单的读取时,修改“隐藏”集合可能会导致多线程环境中出现问题,但这是另一个主题…

哦,我不知道。。。更好+1+1这就是为什么我每天都读stackoverflow。来学习东西。@BrokenGlass项目在TTL过期之前是否会从
MemoryCache
中退出?例如,当到达
MemoryCache.CacheMemoryLimit
时会发生什么?只是寻找实现的想法。