【问题标题】:Why isn't there a "set" interface in the .NET framework?为什么.NET 框架中没有“设置”接口?
【发布时间】:2011-01-13 01:41:13
【问题描述】:

我正在专门考虑泛型类HashSet<T>。它实现了几个接口,但没有一个接口暴露了一个集合的正确语义。具体来说,没有一个支持返回boolAdd 方法。 (ICollection<T> 支持 void Add,可以在紧要关头使用。)这些接口也不支持常见的集合操作,如联合和交集。 (尽管必须说其中一些操作可以通过扩展IEnumerable<T> 来使用。)

这意味着该类只能像直接实现的集合一样使用。即,您不能这样做:

ISet<int> = new HashSet<int>;

据我所知,无论如何。那么是什么促使我们选择将其排除在外呢?

也许最重要的是:即使您可以将 HashSet&lt;T&gt; 转换为 ICollection&lt;T&gt; 等,您在公开的 API 中也会失去语义价值。也就是说,您的 API 的使用者没有任何迹象表明他们正在使用一组。因此,虽然您可以致电ICollection&lt;T&gt;.Add 并通过,但如果他们尝试添加一个项目两次但它不起作用,人们会感到困惑。一个固定的界面会给人们正确的期望。

【问题讨论】:

  • ISet&lt;T&gt; 有什么 ICollection&lt;T&gt; 没有?
  • 哦,我想我明白了……一个返回 boolAdd 方法,嗯?
  • @dan - 您不能将重复项添加到集合中。
  • @dan - IsSubsetOfUnionWith
  • 你的意思是只用于它的直接实现?声明 ICollection 的变量/参数,并且您可以访问 add 方法。然而,该合同并没有真正说它是一个集合,但这不是因为显式实现

标签: .net collections interface set


【解决方案1】:

查看Iesi.Collections.ISet,它添加了标准库中缺少的此功能。

【讨论】:

    【解决方案2】:

    虽然我不确定为什么它没有更早地进入基类库,但 ISet 在 .NET 4.0 中可用,距离发布仅几周时间。该接口具有您对集合所期望的大多数方法。以下是一些受支持的方法:

    • 添加、清除、包含、CopyTo、GetEnumerator、删除(继承)
    • 除了
    • 相交
    • IsSubsetOf
    • IsSupersetOf
    • 重叠
    • UnionWith

    HashSetSortedSet 集合实现了这个新接口。

    【讨论】:

    • 实际上我什至没有想到检查它是否会在 .NET 4.0 中。我想,如果它现在还没有被包括在内,那肯定是有原因的。 :) 我会期待未来的项目。
    猜你喜欢
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2014-05-17
    • 2023-01-26
    • 2010-11-15
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多