在.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. tableView优化

    ※ tableView优化 概括说:1.使用不透明视图.2.不要重复创建不必要的table cell.3.减少视图的数目.4.不要做多余的绘制工作.5.预渲染图像.6.不要阻塞主线程. 详细说:1.使 ...

  2. swift 2.0 语法 字典

    //: Playground - noun: a place where people can play import UIKit /*: 字典 * 和OC的区别 * 1. {} 替换为 [] * 2 ...

  3. 【Spark】DAGScheduler源代码浅析

    DAGScheduler DAGScheduler的主要任务是基于Stage构建DAG,决定每个任务的最佳位置 记录哪个RDD或者Stage输出被物化 面向stage的调度层.为job生成以stage ...

  4. debian网络静态ip配置

    本配置适合于服务器上的静态ip配置,该方法简单可靠. 1 临时配置 ifconfig eth0 192.168.1.97 netmask 255.255.255.0 broadcast 192.168 ...

  5. cf 749D Leaving Auction

    Leaving Auction time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  6. 快速访问GitHub

    Github网站可以访问,但是由于网络代理商的原因,造成访问速度很慢. 本文采取方法:手动更改hosts Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与 ...

  7. C. Searching for Graph(cf)

    C. Searching for Graph time limit per test 1 second memory limit per test 256 megabytes input standa ...

  8. Complicated Expressions(表达式转换)

    http://poj.org/problem?id=1400 题意:给出一个表达式可能含有多余的括号,去掉多余的括号,输出它的最简形式. 思路:先将表达式转化成后缀式,因为后缀式不含括号,然后再转化成 ...

  9. codevs3370 选学霸(背包dp,并查集)

    3372 选学霸  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相 ...

  10. P3299 [SDOI2013]保护出题人

    传送门 全世界都会二分可海星-- 首先记\(sum[i]\)为\(a[i]\)的前缀和,那么第\(i\)个的答案就是\(max\{\frac{sum[i]-sum[j-1]}{x+(i-j)d}\}\ ...