使用IEnumerable和ICollection与IList的自定义集合

时间:2012-10-31 11:42:59

标签: c# ienumerable ilist icollection custom-collection

我需要设计自己的自定义GenericCollection课程。现在我有很多选项可以使用IEnumerableICollectionIList来推导它,后面会提供一些附加功能。

我很困惑,如果我使用IEnumerable<T>,我可能需要声明对象实际上保存集合,就像在这种情况下_list

public class GenericCollection<T> : IEnumerable<T>
{
    private List<T> _list;
    //...
}

但如果我使用ICollection<T>IList<T>,我不需要声明List对象,因为它是隐式可用的。

public class GenericCollection<T> : IList<T>
{
    // no need for List object
    //private List<T> _list; 
    //...
}

这两种方法在性能方面有什么区别?

在哪种情况下,每个人都是首选,特别是在设计自己的集合时。我对轻量级收藏感兴趣,性能良好。我认为这可以通过IEnumerable<T>实现,但是如何与一些强有力的理由一起使用呢?

我已查看了一些现有帖子,但没有提供所需信息。

Returning 'IList' vs 'ICollection' vs 'Collection'

3 个答案:

答案 0 :(得分:44)

IEnumerableICollectionIList(通常,任何带有I前缀的类型)都只是interfaces。它们让你揭露你的类会做什么,但与你inherit类不同,接口不会为你提供他们说你必须做的任何事情的默认实现。

至于选择哪个界面,这是一个快速指南:

  • IList是可以通过索引访问的ICollection
  • ICollectionIEnumerable,可以轻松访问AddRemoveCount等内容。
  • IEnumerable是可以枚举的任何内容,即使这些内容的列表在您枚举之前不存在。

您可能希望扩展(或保留为运行大多数逻辑的私有字段)的某些类是List<T>Collection<T>,(实现IList<T>,但是,通过更轻松地访问覆盖实施,请参阅Collection<T> versus List<T> what should you use on your interfaces?,了解这两者之间的巨大差异)ObservableCollection<T>或非{(1}}和Dictionary<T, U>列表的集合。有关其中任何一项的更多信息,请查阅该课程上的MSDN文档。

答案 1 :(得分:1)

首先,您不必实际选择这些接口,如果有必要,您可以实现这三个接口。其次,实现IEnumerable并不要求您公开底层列表。您只需实现方法即可使用基础列表的枚举器。

Performancewise,我怀疑会产生多大的影响,专注于你在功能上需要什么。确切知道的唯一方法是衡量。

答案 2 :(得分:0)

性能不太可能取决于实现哪些接口。它取决于处理器为实现某个目标而必须运行多少指令。如果您实现IEnumerable并包裹List,您可能最终会编写Add / Remove / this []方法,这些方法只是将调用传播到List,这会增加性能开销。因此,尽管我没有进行任何测量,但继承方法可能会更快一些。

但是,这些细节通常仅适用于需要节省每个可能的CPU周期的实时应用程序。 Eric Lippert有一篇关于关注这些细节的精彩文章:http://blogs.msdn.com/b/ericlippert/archive/2003/10/17/53237.aspx。通常,您可能会更好地使用更适合应用程序的业务逻辑和体系结构的方法,而不是性能详细信息。