具有超时/过期能力的列表

我需要一个这样的函数:

AddToList(txtName, timeExpire); 

它看起来像是自描述的,该项目将自动过期并从列表中删除。

我无法想象如何做到这一点。 任何人都可以给我一个线索吗?

你也可以试试这样的东西。

创建自定义类

  public class Custom { string item; //will hold the item Timer timer; //will hanlde the expiry List refofMainList; //will be used to remove the item once it is expired public Custom(string yourItem, int milisec, List refOfList) { refofMainList = refOfList; item = yourItem; timer = new Timer (milisec); timer.Elapsed += new ElapsedEventHandler(Elapsed_Event); timer.Start(); } private void Elapsed_Event(object sender, ElapsedEventArgs e) { timer.Elapsed -= new ElapsedEventHandler(Elapsed_Event); refofMainList.Remove(this); } } 

现在您可以创建List并使用它。 一旦指定的时间结束,它的项目将被删除。

如果您的目标是.NET 4或更高版本,请使用MemoryCache (或从ObjectCache派生自定义实现)。

回到4之前,如果你想在你的应用程序中使用缓存,你可以简单地抓住System.Web.Cache并在任何.NET应用程序中使用它。 它对任何“web”代码都没有任何实际依赖性,但它确实需要您引用System.Web.dll。 这看起来很奇怪(比如从C#应用程序引用Microsoft.VisualBasic.dll),但实际上并没有对您的应用程序造成负面影响。

随着客户端配置文件的出现,打破以桌面为中心的代码和以服务器为中心的代码之间的依赖关系变得非常重要。 所以引入了ObjectCache,以便桌面应用程序(不确定silverlight,wp7)开发人员可以打破这种依赖关系,并能够只针对客户端配置文件。

只是一个快速的例子,答案将给出

添加对System.Runtime.Caching的引用

  MemoryCache cache = new MemoryCache("CacheName"); cache.Add(key, value, new CacheItemPolicy() { AbsoluteExpiration = DateTime.UtcNow.AddSeconds(20) }); 

然后,您可以通过访问来检查缓存中是否仍有某些内容

  if (cache.Contains(key)) 

如果您希望缓存具有较低的时间限制,那么您需要通过一个不错的小黑客来更改缓存的刷新时间。

MemoryCache AbsoluteExpiration表现奇怪

您需要创建一个可以管理它的对象。

想想每个项目需要存储什么。 基本上,数据(例如txtName )和到期时间。 这意味着您可能需要一个只包含这两个元素的类或结构。

您的ExpiringList类将是该类型的列表。

现在您已经拥有了基本数据结构( ExpiringListItem的集合/列表),您需要考虑要支持的操作。 目前您已经列出了AddToList,其他可能是RemoveFromList,Clear,并且可能会迭代所有项目。

与普通List相比,ExpiringList唯一独有的是您希望自动删除过期的项目。 因此,让ExpiringList实现接口IList并在内部使用私有List是ExpiredListItem ,可能你可以使你的列表(以及必需的ExpiredListItem类)通用。

除了理解和实现inheritance(实际上是一个单独的问题)之外,棘手的部分是研究如何删除过期的项目。

这意味着在您的类中创建一个方法,该方法对您的项目进行迭代(以相反的顺序),将它们的到期时间与当前时间进行比较并删除过期时间。

您只需调用内部列表中的相应方法即可实现该接口。

你可以说,在这一点上,你已经完成了,因为你只是定期调用该方法,以确保在使用列表中的项目之前所有过期的项目都已消失。

也许更好的选择是在内部列表上运行方法之前调用此方法。 根据您使用列表的方式,这可能有点过分。