【发布时间】:2016-05-12 14:41:26
【问题描述】:
我正在尝试创建一个类,该类具有在某些定义的TimeSpan 之后过期(从集合中删除)的项目集合;我意识到,如果我不主动删除这些项目,有些项目可能会过期并仍在收藏中。
到目前为止,我无法决定应该如何实现这个类。我不确定我应该实现ICollection、IList、子类List,还是包装List?
public struct EDLItem<T>
{
public T Data { get; set; }
public DateTime Created { get; set; }
public EDLItem(T data) : this()
{
Data = data;
Created = DateTime.Now;
}
public Boolean IsExpired(TimeSpan lifetime)
{
TimeSpan lifeSpan = DateTime.Now.Subtract(Created);
return TimeSpan.Compare(lifeSpan, lifetime) == 1;
}
}
public class ExpiringDataList1<T> : ICollection<EDLItem<T>>{}
public class ExpiringDataList2<T> : IList<EDLItem<T>>{}
public class ExpiringDataList3<T> : List<EDLItem<T>>{}
public class ExpiringDataList<T>
{
public TimeSpan DataLifetime { get; set; }
private List<EDLItem<T>> DataList { get; set; }
public ExpiringDataList(TimeSpan dataLifetime)
{
DataLifetime = dataLifetime;
DataList = new List<EDLItem<T>>();
}
public void CheckExperiations()
{
DataList.RemoveAll(item => item.IsExpired(DataLifetime));
}
public void Add(T item)
{
DataList.Add(new EDLItem<T>(item));
CheckExperiations();
}
}
我的计划是在将项目添加到集合或迭代集合时检查/删除已过期的项目(在为集合获取 IENumerable 之前)。
我应该为这个实现做出什么选择?
【问题讨论】:
-
1) 不,不要扩展这些类中的任何一个。如果实现
IList方法是有意义的,那就去做吧,但我认为这将是一份违约合同。 2) 使用现有的MemoryCache类。 3) 如果不出意外,请使用DateTime.UtcNow而不是DateTime.Now。 -
@juharr:我同意,但是对于引用类型,它不应该对性能产生影响(而且我认为人们不需要经常缓存结构)。它也是线程安全的,这对于缓存来说通常是一件好事。
-
完全基于意见的问题...由于我们不知道您的课程有哪些用例,因此无法提出更好的建议。我唯一要删除的是直接从
List派生 - 因为无论如何您都必须覆盖所有方法以检查过期。另请注意,IList 项的索引通常预计为 O(1),因此如果这是重要的操作,您必须进行一些广泛的优化以避免每次访问时CheckExperiations()的 O(n) 成本。
标签: c# list collections