【问题标题】:What is the most basic class that inherits ICollection<T>继承ICollection<T>的最基本的类是什么
【发布时间】:2011-02-15 06:41:17
【问题描述】:

我需要一个可以添加和枚举的通用集合类。由于ICollection&lt;T&gt; 继承自IEnumerable&lt;T&gt;,因此该类实际上只需要继承自ICollection&lt;T&gt;。 BCL 中是否有一个简单的泛型类,它像 CollectionBase 的泛型版本一样继承 ICollection&lt;T&gt;?如果不是,那么哪个类最接近?

我猜List&lt;T&gt; 这是我一直在使用的,但我不需要顺序方面。有什么更好的吗(我的意思是[更小的内存占用/更快的访问/更简单])?如果有包包就完美了。

编辑 1: 在我的特定实例中,我 .concating 到另一个 IEnumerable,查询它,然后显示结果(没有特定顺序)。我不是想自己上课。我只是需要多次制作一次性收藏品,我认为找到最好的一次性用品会很有用。因为我觉得我做过很多次类似的事情,所以我觉得我应该尽可能地保持这个问题的笼统(没有双关语),我现在知道得更好了。

编辑 2: 感谢大家的回答,正如@BlueRaja 指出的那样,任何简单的类都会有大致相同的开销,因此我想我会坚持我原来的使用方式List&lt;T&gt;。既然它们都差不多,那么“打字更容易”和“我不必再引入另一个用途”这些愚蠢的理由并不是那么糟糕的理由。

【问题讨论】:

  • 听起来你毕竟想要顺序方面,因为你将它与另一个可枚举连接。

标签: c# .net icollection


【解决方案1】:

[更小的内存占用/更快的访问/更简单]

它们都将具有几乎相同的内存占用,如果您使用 ICollection,则界面不会改变。

真正重要的是哪一个最适合您需要的操作:链表可以更好地添加/删除(头/尾元素),而基于数组的列表具有随机访问。还有其他结构 - 您应该使用哪种结构取决于您的应用程序。

【讨论】:

  • 说它们都具有相同的内存占用并不十分准确。链表将使用比基于数组的列表更多的内存。正如您所注意到的,它对于末端的插入和删除肯定表现得更好。如果你已经有一个 LinkedListNode 指针(有时不管),这也可以应用在中间。
【解决方案2】:

您可能想查看Collection&lt;T&gt;。正如文档所示,它是为明确的子类目的而设计的:

为泛型集合提供基类。

话虽如此,任何收藏都可以;我继承自List&lt;T&gt;Stack&lt;T&gt; 等等;选择最接近您实际需要的功能。

【讨论】:

  • 默认情况下 Collection&lt;T&gt; 使用 List&lt;T&gt; 作为它的后备存储,因此它并不比 List&lt;T&gt; 更小/更快,但恰恰相反——它是一个额外的抽象层(并不是说它会一个可测量的差异)。
  • 这可能有些相关:stackoverflow.com/questions/426182/…
  • @Sam:默认情况下是的,但是您可以使用任何东西作为后备存储。这就是他们介绍它的原因;这样您就可以设计集合类,而不必担心使用哪种后备存储,以避免将自己耦合到特定的实现。
  • @Igor:我真的不明白那个链接是如何相关的。这是关于从方法返回抽象接口类型,而不是内部使用的具体类型。
  • 更不用说...您的问题是从字面上询问是否存在“CollectionBase 的通用版本”。嗯,就是这样。 CollectionBase 使用 ArrayList 作为其内部存储。 Collection&lt;T&gt; 默认使用List&lt;T&gt;,一般等价于ArrayListCollection&lt;T&gt; 在所有有意义的方面都是CollectionBase 的通用等价物。这就是您所提问题的答案。
【解决方案3】:

更小更快完全取决于您正在做什么以及您的需求是什么。我可能推荐的唯一其他类是LinkedList&lt;&gt;,它实现了ICollection&lt;&gt;

【讨论】:

  • 在我的特定实例中,我将 concating 到另一个 IEnumerable,查询 IEnumerable 并显示输出。 LinkedList&lt;&gt; 看起来它的结构比 List 还要多。
  • @Martin:“更多结构”并不意味着“更慢”或“更大的内存占用”。即使每个列表中有 1,000,000 个项目,您仍然只有 两个 列表,因此列表本身的内存开销并不重要。
  • @Martin Neal,这些细节有助于包含在原始问题中。 :-)
【解决方案4】:

您可以使用 Reflector 检查 .NET FCL 并查看哪些类使用该集合。 (有一个可以按F3启动的搜索功能。)

您还可以查看C5 Library,看看是否已经实现了满足您需求的集合。查看 C5 Manual 第 13 页了解集合接口层次结构。

【讨论】:

    【解决方案5】:

    CollectionBase 的存在主要是为了提供一种创建类型化集合的简单机制。使用泛型,所有集合现在都是类型化的。过去使用CollectionBase 扩展的绝大多数情况现在应该使用任何内置集合,例如List&lt;&gt;LinkedList&lt;&gt;

    Collection&lt;&gt; 仍然存在于那些出于类型以外的原因需要提供自定义集合的人(即添加时的额外验证或某些非标准逻辑)。 Collection&lt;&gt; 不像 CollectionBase 过去那样常用,而且服务的需求要小得多。

    【讨论】:

      猜你喜欢
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2010-12-01
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多