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> 类型的表达式代替更通用的接口类型可能会更有用,因为可 访问这个更高效的实现。
B.4 集的更多相关文章
- 启动了VSAN服务的主机不在vCenter集群中
背景: 这个问题的来源是,某用户将该ESXi主机直接夺取到另一个vCenterA的管辖中,而这个vCenterA中集群A开启了VSAN功能,导致再次反向夺取到vCenterB中的时候带有了来自于集群A ...
- Apache Ignite之集群应用测试
集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...
- 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- Ubuntu 14.04中Elasticsearch集群配置
Ubuntu 14.04中Elasticsearch集群配置 前言:本文可用于elasticsearch集群搭建参考.细分为elasticsearch.yml配置和系统配置 达到的目的:各台机器配置成 ...
- windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...
- 在开启DRS的集群中修复VMware虚拟主机启动问题
通过iSCSI方式连接到ESXi主机上的外挂存储意外失联了一段时间,导致部分虚拟主机在集群中呈现出孤立的状态,单独登陆到每台ESXi上可以看到这些虚拟主机都变成了unknow状态.因为有过上一次(VM ...
- 通过VMware的PowerCLI配置集群内指定主机的vMotion功能
PowerCLI是VMware开发的基于微软(MSFT)的PowerShell的命令行管理vSphere的实现,因此在批量化操作方面CLI会减轻很多GUI环境下的繁琐重复劳作. 现有场景中有大量的物理 ...
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
集群概念介绍(一)) 白宁超 2015年7月16日 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习 ...
- 【Big Data】HADOOP集群的配置(一)
Hadoop集群的配置(一) 摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得.以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问 ...
随机推荐
- Unity3D 怎样在安卓手机上播放视频
曾经仅仅会在电脑上通过Unity3D播放视频,研究了下发现通过Unity3D在手机上播放视频也很easy.现介绍例如以下. void OnGUI() { if (GUI.But ...
- Mongo使用
在用mongo进行查询时,$exists表示是否document是否包括这个field,即使field的value为null也算是包括. $exists Syntax: { field: { $exi ...
- Ubuntu 13.10 安装 TeX Live 2013
注:笔者也是刚刚接触TeX系统,水平有限,若有疏漏之处还望指正. 中文解决方案 对于LaTeX中文排版,比较方便有这样的几种解决方案:LaTeX+CJK / LaTeX+XeTeX / CTeX.其中 ...
- Zookeeper01
ZooKeeper数据模型Znode
- MySQL启动不了 错误3
这个需要修改下他的路径.楼主:点左下角开始键--运行--SC DELETE MYSQL然后 你再去打开你的MYSQL,就好了. 导入脚本http://jingyan.baidu.com/article ...
- JPA学习笔记(13)——查询缓存
使用hibernate的查询缓存 运行下面代码: String jpql = "FROM User u WHERE u.id = ?"; Query query = entityM ...
- git reset --hard 回滚以后 以后怎么再回去?
恢复的过程很简单: 通过git log -g命令来找到需要恢复的信息对应的commitid,可以通过提交的时间和日期来辨别,找到执行reset --hard之前的那个commit对应的commitid ...
- IJ-java-com-util-common:
ylbtech-IJ-java-com-util-common: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出 ...
- bzoj2780
AC自动机+树链剖分+线段树/树状数组+dfs序+树链的并 题意:给出n个母串和q个询问串,对于每个询问串输出有多少个母串包含这个询问串 N=∑|母串|<=10^5 Q=∑|询问串|<=3 ...
- bzoj3112
http://www.lydsy.com/JudgeOnline/problem.php?id=3112 模板题...模板又打错了... #include<bits/stdc++.h> u ...