在.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 集的更多相关文章

  1. 启动了VSAN服务的主机不在vCenter集群中

    背景: 这个问题的来源是,某用户将该ESXi主机直接夺取到另一个vCenterA的管辖中,而这个vCenterA中集群A开启了VSAN功能,导致再次反向夺取到vCenterB中的时候带有了来自于集群A ...

  2. Apache Ignite之集群应用测试

    集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...

  3. 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  4. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  5. Ubuntu 14.04中Elasticsearch集群配置

    Ubuntu 14.04中Elasticsearch集群配置 前言:本文可用于elasticsearch集群搭建参考.细分为elasticsearch.yml配置和系统配置 达到的目的:各台机器配置成 ...

  6. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

  7. 在开启DRS的集群中修复VMware虚拟主机启动问题

    通过iSCSI方式连接到ESXi主机上的外挂存储意外失联了一段时间,导致部分虚拟主机在集群中呈现出孤立的状态,单独登陆到每台ESXi上可以看到这些虚拟主机都变成了unknow状态.因为有过上一次(VM ...

  8. 通过VMware的PowerCLI配置集群内指定主机的vMotion功能

    PowerCLI是VMware开发的基于微软(MSFT)的PowerShell的命令行管理vSphere的实现,因此在批量化操作方面CLI会减轻很多GUI环境下的繁琐重复劳作. 现有场景中有大量的物理 ...

  9. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)

    集群概念介绍(一)) 白宁超 2015年7月16日 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习 ...

  10. 【Big Data】HADOOP集群的配置(一)

    Hadoop集群的配置(一) 摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得.以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问 ...

随机推荐

  1. using gdb to debug c program

    #include <stdio.h> static void display(int i, int *ptr); int main(void) { int x = 5; int *xptr ...

  2. elasticsearch 布尔过滤器 游标查询 Scroll

    组合过滤器 | Elasticsearch: 权威指南 | Elastic https://www.elastic.co/guide/cn/elasticsearch/guide/current/co ...

  3. android Activity初次的启动的时候播放声音

    代码例如以下: private MediaPlayer mMediaPlayer; mMediaPlayer = new MediaPlayer(); mMediaPlayer = MediaPlay ...

  4. [JSOI 2010] 满汉全席

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1823 [算法] 2-SAT [代码] #include<bits/stdc++ ...

  5. Android之NDK开发(转载)

    http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C+ ...

  6. SpringBoot 启动定时任务

    再项目中大多会使用定时任务来定时执行一些操作,如:文件迁移,备份等等.今天就来跟大家一起学习下如何在SpringBoot中创建定时任务. 1.新建SpringBoot项目,或在原有的项目上添加(不知道 ...

  7. All Discs Considered(拓扑排序)

    http://poj.org/problem?id=1778 题意:有两个DVD,第一个DVD上有编号为1~n1的安装包,第二个DVD上有编号为n1+1~n1+n2的安装包,给出m组关系(a,b) 表 ...

  8. oracle学习笔记(二十) 子程序——函数与触发器

    子程序--函数 语法 之前select语句中使用的函数,都是SQL内置函数,我们可以通过自定义函数更满足我们的需要. 自定义函数的语法和存储过程差不多. create [or replace] $fu ...

  9. redis+php实现秒杀

    使用redis队列,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用(mysql事务在高并发下性能下降很厉害,文件锁的方式也是) 先将商品库存如队列 1 2 3 4 5 6 7 ...

  10. 【转】Linux字符转换命令col

    转自:http://www.cnblogs.com/ningvsban/p/3725464.html [root@www ~]# col [-xb]选项与参数:-x :将 tab 键转换成对等的空格键 ...