我正在考虑通用类HashSet<T>
。它实现了几个接口,但没有公开一个集合的正确语义。具体来说,没有人支持返回Add
的{{1}}方法。 (bool
支持ICollection<T>
,可以在紧要关头使用。)这些接口也不支持常见的集合操作,如联合和交叉。 (虽然必须说其中一些操作可以通过void Add
的扩展来实现。)
这意味着该类只能像直接实现的集合一样使用。即,你不能做这样的事情:
IEnumerable<T>
无论如何,据我所知。那么是什么促使人们选择这样做呢?
也许最重要的是:即使您可以将ISet<int> = new HashSet<int>;
转换为HashSet<T>
等,您也会丢失您所暴露的API中的语义值。也就是说,您的API的消费者没有迹象表明他们正在使用一套。因此,当您可以致电ICollection<T>
并过来时,如果他们尝试两次添加项目并且无效,则会让人感到困惑。设定界面会给人们正确的期望。
答案 0 :(得分:8)
虽然我不确定为什么它之前没有进入基类库,但是在.NET 4.0中可以使用ISet
,这距离发货只有几个星期。界面具有您在集合上所期望的大多数方法。这些是一些受支持的方法:
答案 1 :(得分:0)
查看Iesi.Collections.ISet,这会在标准库中添加此功能。