C#高级编程五十五天----HashSet和SortedSet

饱含不重复元素的集合称为”集(set)”. .NET4包含两个集(HashSet<T>和SortedSet<T>),他们都实现ISet<T>接口.HashSet<T>即包含不重复元素的无序列表,SortedSet<T>集包含不重复元素的有序列表.

ISet<T>接口提供的方法可以创建合集,交集,或者给出一个集合时另一个集的超集或子集的信息.

案例:

//使用HashSet:重复的元素自动被移除,但是不排序

var set = new HashSet<int>() { 5, 9, 2, 1, 2, 2, 3, 7, 4, 9, 9 };

foreach (var item in set)

{

Console.WriteLine(item);

}

Console.ReadKey();

同样的代码,将HashSet换成SortedSet:

//使用SortedSet:重复的元素自动被移除,还进行了排序

var set = new SortedSet<int>() { 5, 9, 2, 1, 2, 2, 3, 7, 4, 9, 9 };

foreach (var item in set)

{

Console.WriteLine(item);

}

Console.ReadKey();

总结:

1.HashSet和SortedSet主要的作用是用来进行两个集合求交集,并集,差集等运算. 集合中包含一组不重复出现且无特性顺序的元素.前者不会自动排序,后者会加入元素后,自动排序

2.两者都无法从特定位置访问其中某个元素.

3.可以使用其查找功能:

Set.Contains(“value”) //返回true或false

4.对集合的操作:

a . SymmetricExceptWith:仅包含该对象或指定集合中存在的元素(但不可同时包含两者中的元素).去除交集,剩下两个集合元素.

b . UnionWith:包含该对象本身和制定集合中存在的所有元素. 并集

c . ExceptWith从当前HashSet<T>对象中移除指定集合中的所有元素 . 差集

d . IntersectWith:仅包含该对象和指定集合中存在的元素. 交集

5.SortedSet对象,可以调用GetViewBetween,Max,Min方法

6.除了SortedSet外,System.Collections.Generic命名空间下,还提供了SortedDictionary和SortedList两个类.

测试HashSet内置的一些方法:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace 集

{

class Program

{

static void Main(string[] args)

{

HashSet<char> setA = new HashSet<char>();

HashSet<char> setB = new HashSet<char>();

setA.Add(‘A‘);

setA.Add(‘B‘);

setA.Add(‘C‘);

setB.Add(‘C‘);

setB.Add(‘D‘);

setB.Add(‘E‘);

Show("Initial content of setA: ", setA);

Show("Initial content of setB: ", setB);

setA.SymmetricExceptWith(setB);   //把 setA、setB 各自特有、对方没有的元素列出来

Show("setA after Symmetric difference with SetB: ", setA);

setA.UnionWith(setB);       //把 setA、setB 的全部元素列出来 (union 并集)

Show("setA after union with setB: ", setA);

setA.ExceptWith(setB);      //把 setA 中,所拥有的 setB 元素移除

Show("setA after subtracting setB: ", setA);

Console.WriteLine();

Console.Read();

}

static void Show(string msg, HashSet<char> set)

{

Console.Write(msg);

foreach (char ch in set)

Console.Write(ch + " ");

Console.WriteLine();

}

}

}

测试SortedSet的方法:

using System;

using System.Collections.Generic;

using System.Linq;//此为Max(),Min()方法的必要调用

using System.Text;

using System.Threading.Tasks;

namespace 集

{

class Program

{

static void Main(string[] args)

{

var set = new SortedSet<int>() { 5, 9, 2, 1, 2, 2, 3, 7, 4, 9, 9 };

foreach (int element in set)

Console.WriteLine(string.Format(" {0}", element));

Console.WriteLine("Max: " + set.Max() );

Console.WriteLine("Min: " + set.Min() );

Console.Write("<br>取 2 ~ 5 之间的值: ");

//只取值为 2 ~ 5 之间的元素

var subSet = set.GetViewBetween(2, 5);

foreach (int i in subSet)

{

Console.Write(i + " ");

}

Console.WriteLine();

Console.Read();

}

static void Show(string msg, HashSet<char> set)

{

Console.Write(msg);

foreach (char ch in set)

Console.Write(ch + " ");

Console.WriteLine();

}

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 22:27:58

C#高级编程五十五天----HashSet和SortedSet的相关文章

【读书笔记】C#高级编程 第二十五章 事务处理

(一)简介 事务的主要特征是,任务要么全部完成,要么都不完成. (二)概述 事务由事务管理器来管理和协调.每个影响事务结果的资源都由一个资源管理器来管理.事务管理器与资源管理器通信,以定义事务的结果. 1.事务处理阶段 激活阶段:在这个阶段创建事务. 准备阶段:在这个阶段,每个资源管理器都可以定义事务的结果. 提交阶段:当所有的资源管理器都成功准备好了,就开始这个阶段. 2.ACID属性 事务的特征可以用术语ACID来定义: Atomicity(原子性):表示一个工作单元. Consistenc

C#高级编程 第十五章 反射

(二)自定义特性 使自定义特性非常强大的因素时使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策. 1.编写自定义特性 定义一个FieldName特性: [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)] public class FieldNameAttribute : Attribute { private string name; public FieldNam

【读书笔记】C#高级编程 第十五章 反射

(一)在运行期间处理和检查代码 自定义特性允许把自定义元数据与程序元素关联起来.反射是一个普通术语,它描述了在运行过程中检查和处理程序元素的功能.例如,反射允许完成的任务: 枚举类型的成员 实例化新对象 执行对象的成员 查找程序集的信息 检查应用于某种类型的自定义特性 创建和编译新程序集 (二)自定义特性 使自定义特性非常强大的因素时使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策. 1.编写自定义特性 定义一个FieldName特性: [AttributeUsage(Attribu

C#高级编程七十五天----C#使用指针

在C#中使用指针的语法 假设想在C#中使用指针,首先对项目进行过配置: 看到属性了吗?单击: 看到那个同意不安全代码了吗?选中 然后将有关指针,地址的操作放在unsafe语句块中.使用unsafekeyword是告诉编译器这里的代码是不安全的. unsafekeyword的使用: (1)放在函数前,修饰函数,说明在函数内部或函数的形參涉及到指针操作: unsafe static void FastCopy(byte[] src, byte[] dst, int count) { // Unsaf

C#高级编程三十五天----foreach和yield

枚举 在foreach语句中使用枚举,可以迭代集合中的元素,且无需知道集合中的元素个数. 数组或集合实现带GetEumerator()方法的IEumerable接口.GetEumerator()方法返回一个实现IEunmerable接口的枚举. GetEnumerator()方法用IEnumerable接口定义.foreach语句并不真的需要在集合类中实现这个借口.有一个名为GetEnumerator()的方法,他返回实现了IEnumerator接口的对象就足够了. IEnumerator接口

C#高级编程六十五天----表达式树

表达式树 以前没听过表达式树,只听过表达式,而且听过Lambda表达式,首先介绍一下.NET里表达式树的核心概念:讲代码作为数据,他将一些代码表示为一个对象树,树中的每个节点本身都是一个表达式,不同的表达式类型代表能在代码中执行不同操作:二元操作,一元操作,方法调用等等. System.Linq.Expression命名空间包含了代表表达式的各个类.所有的表达式类都从Expression 类派生,Expresssion是个抽象类,主要包括的是一些静态方法,这些方法用于生成其他表达式类的实例.Ex

shell编程(十五)--- while特殊用法和函数

break:退出循环体 continue:结束本次循环,进入下一次循环. while特殊用法1: while : do done 上述为while的死循环. while特殊用法2: while read LINE do done < /path/to/FILE 作用:通过while读取FILE文件中的每一行,并将其保存在变量LINE中. 函数:function 语法格式: 方法1: function FUNCTIONNAME {     COMMAND } 方法2: FUNCTIONNAME()

第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行一个函数 dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号, signals.engine_started当Scrapy引擎启动爬取时发送该信号.该信号支持返回deferreds.signals.engine_stopped当Scrapy引擎停止时发送

QT开发(五十五)———Qt Quick Controls

QT开发(五十五)---Qt Quick Controls 一.Qt Quick Controls基础 QT5.1发布了Qt Quick的一个全新模块:Qt Quick Controls.Qt Quick Controls模块提供了大量类似Qt Widgets模块的可重用组件. 为了开发基于Qt Quick Controls的程序,需要创建一个Qt Quick Application类型的应用程序,选择组件集的时候注意选择Qt Quick Controls. 二.Qt Quick Control

“全栈2019”Java第五十五章:方法的静态绑定与动态绑定

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第五十五章:方法的静态绑定与动态绑定 下一章 "全栈2019"Java第五十六章:多态与字段详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组&q