为什么.NET框架中没有“set”接口?

时间:2010-02-04 12:44:37

标签: .net collections interface set

我正在考虑通用类HashSet<T>。它实现了几个接口,但没有公开一个集合的正确语义。具体来说,没有人支持返回Add的{​​{1}}方法。 (bool支持ICollection<T>,可以在紧要关头使用。)这些接口也不支持常见的集合操作,如联合和交叉。 (虽然必须说其中一些操作可以通过void Add的扩展来实现。)

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

IEnumerable<T>

无论如何,据我所知。那么是什么促使人们选择这样做呢?

也许最重要的是:即使您可以将ISet<int> = new HashSet<int>; 转换为HashSet<T>等,您也会丢失您所暴露的API中的语义值。也就是说,您的API的消费者没有迹象表明他们正在使用一套。因此,当您可以致电ICollection<T>并过来时,如果他们尝试两次添加项目并且无效,则会让人感到困惑。设定界面会给人们正确的期望。

2 个答案:

答案 0 :(得分:8)

虽然我不确定为什么它之前没有进入基类库,但是在.NET 4.0中可以使用ISet ,这距离发货只有几个星期。界面具有您在集合上所期望的大多数方法。这些是一些受支持的方法:

  • 添加,清除,包含,CopyTo,GetEnumerator,删除(继承)
  • ExceptWith
  • IntersectWith
  • IsSubsetOf
  • IsSupersetOf
  • 重叠
  • UnionWith

HashSetSortedSet个集合实现了这个新界面。

答案 1 :(得分:0)

查看Iesi.Collections.ISet,这会在标准库中添加此功能。