B.4 集
在.NET 3.5之前,框架中根本没有公开集(set)集合。如果要在.NET 2.0中表示集,通常会 使用 Dictionary<,> ,用集的项作为键,用假数据作为值。.NET3.5的 HashSet <T> 在一定程度 上改变了这一局面,现在.NET 4还添加了 SortedSet<T> 和通用的 ISet<T> 接口。尽管在逻辑上, 集接口应该只包含 Add / Remove / Contains 操作,但 ISet<T> 还指定了很多其他操作来控制集 ( ExceptWith 、 IntersectWith 、 SymmetricExceptWith 和 UnionWith )并在各种复杂条件 下验证集( SetEquals 、 Overlaps 、 IsSubsetOf 、 IsSupersetOf 、 IsProperSubsetOf 和 IsProperSupersetOf )。所有这些方法的参数均为 IEnumerable<T> 而不是 ISet<T> ,这乍看 上去会很奇怪,但却意味着集可以很自然地与LINQ进行交互。
B.4.1 HashSet<T>
HashSet<T> 是不含值的 Dictionary<,> 。它们具有相同的性能特征,并且你也可以指定一 个 IEqualityComparer<T> 来自定义项的比较。同样, HashSet<T> 所维护的顺序也不一定就是 值添加的顺序。
HashSet<T> 添加了一个 RemoveWhere 方法,可以移除所有匹配给定谓词的条目。这可以在 迭代时对集进行删减,而不必担心在迭代时不能修改集合的禁令。
B.4.2 SortedSet<T> (.NET 4)
就像 HashSet<T> 之于 Dictionary<,> 一样, SortedSet<T> 是没有值的 SortedDic- tionary<,> 。它维护一个值的红黑树,添加、移除和包含检查(containment check)的复杂度 为O(log n)。在对集进行迭代时,产生的是排序的值。
和 HashSet<T> 一样它也提供了 RemoveWhere 方法(尽管接口中没有),并且还提供了额外 的属性( Min 和 Max )用来返回最小和最大值。一个比较有趣的方法是 GetViewBetween ,它返 回介于原始集上下限之内(含上下限)的另一个 SortedSet<T> 。这是一个易变的活动视图—— 对于它的改变将反映到原始集上,反之亦然,如代码清单B-2所示。
var baseSet = new SortedSet<int> { , , , , };
var view = baseSet.GetViewBetween(, );
view.Add();
Console.WriteLine(baseSet.Count);
foreach (var item in view)
{
Console.WriteLine(item);
}
尽管 GetViewBetween 很方便,却不是免费的午餐:为保持内部的一致性,对视图的操作可 能比预期的更昂贵。尤其在访问视图的 Count 属性时,如果在上次遍历之后基础集发生了改变, 操作的复杂度将为O(n)。所有强大的工具,都应该谨慎用之。 SortedSet<T> 的最后一个特性是它公开了一个 Reverse() 方法,可以进行反序迭代。 Enumerable.Reverse() 没有使用该方法,而是缓冲了它调用的序列的内容。如果你知道要反 序访问排序集,使用 SortedSet<T> 类型的表达式代替更通用的接口类型可能会更有用,因为可 访问这个更高效的实现。
最新文章
- React Native FlexBox
- CYQ.Data 快速开发EasyUI
- 集合2--毕向东java基础教程视频学习笔记
- iOS应用性能调优好文mark
- flask请求管道
- Math DayTwo
- 图解集合1:ArrayList
- 实现iOS前台时的推送弹窗效果
- jQuery显示隐藏动态效果的几种写法
- Django数据库设计中字段为空的方式
- 学习JQuery的$.Ready()与OnLoad事件比较
- 【Linux】一个简单的线程创建和同步的例子
- What Influences Method Call Performance in Java?--reference
- 十四、C# 支持标准查询运算符的集合接口
- mysql----show slave status \G 说明
- WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码
- react 表单受控和非受控
- mysql中explain
- git branch 命令
- bzoj 1455: 罗马游戏
热门文章
- 如何删除 mac 系统信息下的安装记录
- Angular常用标记
- Codeforces Round #142 (Div. 2)B. T-primes
- getElementByTagName的使用
- Another lottery
- 枚举详解之EnumSet、EnumMap用法
- Akka源码分析-Persistence
- 34、JavaScript面向对象(内置构造函数&;相关方法|属性|运算符&;继承&;面向对象)
- array_column()函数兼容低版本
- day02_12/12/2016_bean的实例化之普通工厂方式