【问题标题】:Should this class implement ICollection, IList, List or neither? [closed]此类是否应该实现 ICollection、IList、List 或都不实现? [关闭]
【发布时间】:2016-05-12 14:41:26
【问题描述】:

我正在尝试创建一个类,该类具有在某些定义的TimeSpan 之后过期(从集合中删除)的项目集合;我意识到,如果我不主动删除这些项目,有些项目可能会过期并仍在收藏中。

到目前为止,我无法决定应该如何实现这个类。我不确定我应该实现ICollectionIList、子类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


【解决方案1】:

一些建议:

  • 一般来说,比起继承,更喜欢组合。
  • 不要扩展List&lt;T&gt;,除非您正在构建一个新的列表抽象,即使那样,也可能不会。听起来您实际上正在构建这样一个抽象,而大多数询问扩展 List 的人都没有。在这种情况下,问自己两个问题:(1)我是否需要列表的底层机制,以及(2)有人会多态地使用这个东西吗?请参阅下一点。
  • 存在启用多态性的接口。在决定是否实现接口时,请考虑客户端是否会将您的类与其他不相关的类多态地一起使用。有人曾经想要对你的东西进行排序、搜索、过滤或加入吗?然后实现IEnumerable&lt;T&gt;。有人会将它传递给采用IList&lt;T&gt; 的方法吗?然后实施。但这个决定应该由客户要求驱动,而不是你可能实现的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-12
    • 2014-12-07
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多