转载 HashSet用法
NET 3.5在System.Collections.Generic命名空间中包含一个新的集合类:HashSet<T>。这个集合类包含不重复项的无序列表。这种集合称为“集(set)”。集是一个保留字,所以该类有另一个名称HashSet<T>。这个名称很容易理解,因为这个集合基于散列值,插入元素的操作非常快,不需要像List<T>类那样重排集合。
HashSet<T>类提供的方法可以创建合集和交集。表1列出了改变集的值的方法。
表1
HashSet<T>的修改方法 | 说 明 |
Add() | 如果某元素不在集合中,Add()方法就把该元素添加到集合中。在其返回值Boolean中,返回元素是否添加的信息 |
Clear() | 方法Clear()删除集合中的所有元素 |
Remove() | Remove()方法删除指定的元素 |
RemoveWhere() | RemoveWhere()方法需要一个Predicate<T>委托作为参数。删除满足谓词条件的所有元素 |
CopyTo() | CopyTo()把集合中的元素复制到一个数组中 |
ExceptWith() | ExceptWith()方法把一个集合作为参数,从集中删除该集合中的所有元素 |
IntersectWith() | IntersectWith()修改了集,仅包含所传送的集合和集中都有的元素 |
UnionWith() | UnionWith()方法把传送为参数的集合中的所有元素添加到集中 |
表2列出了仅返回集的信息、不修改元素的方法。
HashSet<T>的验证方法 | 说明 |
Contains() | 如果所传送的元素在集合中,方法Contains()就返回true |
IsSubsetOf() | 如果参数传送的集合是集的一个子集,方法IsSubsetOf()就返回true |
IsSupersetOf() | 如果参数传送的集合是集的一个超集,方法IsSupersetOf()就返回true |
Overlaps() | 如果参数传送的集合中至少有一个元素与集中的元素相同,Overlaps()就返回true |
SetEquals() | 如果参数传送的集合和集包含完全相同的元素,方法SetEquals()就返回true |
在示例代码中,创建了3个字符串类型的新集,并用一级方程式汽车填充。HashSet<T>类实现了ICollection<T>接口。但是在该类中,Add()方法是显式实现的。Add()方法的区别是返回类型,它返回一个布尔值,说明是否添加了元素。如果该元素已经在集中,就不添加它,并返回false。
HashSet < string > companyTeams =new HashSet < string > (){ "Ferrari", "McLaren", "Toyota", "BMW","Renault", "Honda" }; HashSet < string > traditionalTeams =new HashSet < string > (){ "Ferrari", "McLaren" }; HashSet < string > privateTeams =new HashSet < string > (){ "Red Bull", "Toro Rosso", "Spyker","Super Aguri" }; if (privateTeams.Add("Williams"))
Console.WriteLine("Williams added");
if (!companyTeams.Add("McLaren"))
Console.WriteLine("McLaren was already in this set");
两个Add()方法的输出写到控制台上:
Williams added
McLaren was already in this set
方法IsSubsetOf()和IsSupersetOf()比较集和实现了IEnumerable<T>接口的集合,返回一个布尔结果。这里,IsSubsetOf()验证traditionalTeams中的每个元素是否都包含在companyTeams中,IsSupersetOf()验证companyTeams 是否是traditionalTeams的超集。
if (traditionalTeams.IsSubsetOf(companyTeams))
{
Console.WriteLine("traditionalTeams is " +"subset of companyTeams");
} if (companyTeams.IsSupersetOf(traditionalTeams))
{
Console.WriteLine("companyTeams is a superset of " +"traditionalTeams");
}
这个验证的结果如下:
traditionalTeams is a subset of companyTeams
companyTeams is a superset of traditionalTeams
Williams也是一个传统队,因此这个队添加到traditionalTeams集合中:
traditionalTeams.Add("Williams");//前面代码中privateTeams已经加入该元素
if (privateTeams.Overlaps(traditionalTeams))
{
Console.WriteLine("At least one team is " +"the same with the traditional " +"and privateteams");
}
这有一个重叠,所以结果如下:
At least one team is the same with the traditional and private teams.
调用UnionWith()方法,给变量allTeams填充了companyTeams、PrivateTeams和traditionalTeams的合集:
HashSet < string > allTeams =new HashSet < string > (companyTeams);
allTeams.UnionWith(privateTeams);
allTeams.UnionWith(traditionalTeams);
Console.WriteLine();
Console.WriteLine("all teams");
foreach (var team in allTeams)
{
Console.WriteLine(team);
}
这里返回所有的队,但每个队都只列出一次,因为集只包含唯一值:
Ferrari
McLaren
Toyota
BMW
Renault
Honda
Red Bull
Toro Rosso
Spyker
Super Aguri
Williams
方法ExceptWith()从allTeams集中删除所有的私人队:
allTeams.ExceptWith(privateTeams);
Console.WriteLine();
Console.WriteLine("no private team left");
foreach (var team in allTeams)
{
Console.WriteLine(team);
}
集合中的其他元素不包含私人队:
Ferrari
McLaren
Toyota
BMW
Renault
Honda
1.HashSet集合
HashSet是以数学Set集合为基础的,使用HashSet可以提高集合的运算。使用HashSet集合不自带排序方法,如果需要排序的需求可以参考使用List<T>集合配合Sort方法。
HashSet的优势在与运算快,作为一种存放在内存的数据,可以很快的进行设置和取值的操作。HashSet无法向里面添加重复的数据,避免添加HashSet<T>里面的数据重复。我们使用HashSet常常在集合相加集合相减这些集合与集合之间的操作之中。
使用HashSet作为内存存储的快速数据库,这个需要随时跟新HashSet里面的数据,因为在HashSet中一个长时间未被访问的数据,将被系统自动回收掉,那么就会导致失败,那么如何才能保证HashSet里面的值是长存在的而且达到不断的更新里面的值呢?
首先程序过来访问我们HashSet里面有没有需要的数据,如果有我们需要的数据就直接返回给用户,不用调用查询数据库的操作。如果HashSet里面没有我们需要的数据,程序再去查询一次数据库是否有该Query数据,如果有返回给用户同时把查询的结果添加到HashSet里面,这么做可以一定程度的降低查询数据库所带来的不便,但是不能根除,需要进一步提升性能,可以查看前面的缓存策略使用memcached来提高网站查询和访问。
1.1.我们要求两个集合的并集
HashSet<int> numbers1;
HashSet<int> numbers2;
//分别进行numbers1和numbers2的值初始化或赋值
numbers1.UnionWith(numbers2);//求两个集合的并集。1.2.求两个集合的交集
HashSet<int> numbers1;
HashSet<int> numbers2;
//分别进行numbers1和numbers2的值初始化或赋值
numbers1.IntersectWith(numbers2);//求两个集合的交集。1.3.求两个集合的差集
HashSet<int> numbers1;
HashSet<int> numbers2;
//分别进行numbers1和numbers2的值初始化或赋值
numbers1.ExceptWith(numbers2);//求两个集合的差集。1.4.求两个集合的对称差集
HashSet<int> numbers1;
HashSet<int> numbers2;
//分别进行numbers1和numbers2的值初始化或赋值
numbers1.SymmetricExceptWith(numbers2);//求两个集合的对称差集。
2.HashSet常用扩展方法
2.1.Add,将项目添加到HashSet之中。
2.2.Clear,清空HashSet里面的值。
2.3.Remove,从HashSet中移除值。
2.4Contains,判断HashSet是否包含指定项目。
2.4Equals(Object),判断是否相等。
3.HashSet与Linq操作
HashSet<T>与LINQ的对等的方法
UnionWith ==> Union
IntersectWith ==> Interset
ExceptWith ==> Except
不提供排序 ==> Distinct
那么我们已经有很多的集合类型如List<T> ,Dictionary<TKey,TValue>或Hashtable等这些集合类型,我们该如何选定我应该采用的哪一个集合类型呢?
“如果你必须建立新的设定,或则如果应用程序只需要存取提供的任务,那么使用任何的IEnumerable<T>集合都已经足够了。但是,如果应用程序需要存取其他值,或则不建议不需要建立新的集合,这时可使用HashSet<T>.”——摘自MSDN
相关文章:
C# 集合交、并、差、去重,对象集合交并差(需要引用linq)
https://www.cnblogs.com/hao-1234-1234/p/10408602.html
转载 HashSet用法的更多相关文章
- 转载:C# HashSet 用法
原文地址:http://www.cnblogs.com/xiaopin/archive/2011/01/08/1930540.html 感谢博主分享! NET 3.5在System.Collect ...
- [转载]ssget 用法详解 by yxp
总结得很好的ssget用法.....如此好文,必须转载. 原文地址: http://blog.csdn.net/yxp_xa/article/details/72229202 ssget 用法详解 b ...
- 刷题upupup【Java中HashMap、HashSet用法总结】
HashMap: 常用操作 1. containsKey() 判断HashMap是否包含key 2. containsValue() 判断HashMap是否包含“值为value”的元素 3. get( ...
- C# HashSet 用法[转]
原文链接 .NET 3.5在System.Collections.Generic命名空间中包含一个新的集合类:HashSet<T>.这个集合类包含不重复项的无序列表.这种集合称为“集(se ...
- [转载]Vector用法(C++ Primer中文版)
转自:http://blog.sciencenet.cn/blog-261330-551086.html vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和 string 对 ...
- [转载]dbms_lob用法小结
http://blog.sina.com.cn/s/blog_713978a50100prkt.html CLOB里存的是2进制 判定长度 DBMS_LOB.GETLENGTH(col1)获取文本 ...
- 转载 | embed用法(网站中视频、音频的添加)
网站中添加视频: <embed src="http://player.video.qiyi.com/390cf6c74450e4c70b7bd2d883169914/0/0/w_19r ...
- [转载]sublime用法精华
Sublime Text 全程指南 九月 03.2015. 暂无评论 永远站 作者:Lucida 原文链接:http://lucida.me/blog/sublime-text-complete-gu ...
- HashSet代码分析
HashSet (jdk 1.7)的继承关系如下: HashSet是使用HashMap实现的一个没有重复元素的集合.HashSet用法如下: HashSet<String> hashSet ...
随机推荐
- 【C#进阶】拥抱Lambda(二)
语言的设计,真的是挺有意思的.第一次看这个代码[1]时,旁人随口了一句"哇,好多实心句号". 当时马上一个想法是--怎么实现的?返回了对象,然后再调用方法?然后就放下了,后来发现, ...
- Windows下安装配置爬虫工具Scrapy及爬虫环境
爬虫工具Scrapy在Mac和Linux环境下都相对好装,但是在Windows上总会碰到各种莫名其妙的问题.本文记录下Scrapy在Window上的安装过程. 本文是基于Python2.7及Windo ...
- 关于GROUP BY和聚合函数
可以这样去理解group by和聚合函数 转自 http://www.cnblogs.com/wiseblog/articles/4475936.html 写在前面的话:用了好久group by,今天 ...
- java操作数据库的基本方法
此次开发工具为eclipse,才有的数据库驱动是mysql-connector-java-5.1.8-bin.jar 第一步,在eclipse的工程目录中引用mysql驱动 驱动下载地址:https: ...
- MySQL 5.5主从复制(Replication)
简介 MySQL的主从复制(Replication),可以保持两台MySQL数据库的内容一致.因为其同步过程是异步的,所以备份数据库上做任何操作,都不会影响主数据库的性能.对游戏后台数据库而言,这是一 ...
- vue2打包时内存溢出解决方案
vue项目完成时,若项目过大,就会出现内存溢出的问题,导致vue打包不成功 错误截图 解决方案 在依赖package.json中修改build为 "build":"nod ...
- Android:一个高效的UI才是一个拉风的UI(二)
趁今晚老大不在偷偷早下班,所以有时间继续跟大伙扯扯UI设计之痛,也算一个是对上篇<Android:一个高效的UI才是一个拉风的UI(一)>的完整补充吧.写得不好的话大家尽管拍砖~(来!砸死 ...
- Editplus php
一.配置PHP帮助手册 1.打开Editplus,[工具]-->[配置用户工具],在[添加工具]子菜单下选择[HTML帮助(*.chm)(T)],文件路径选择php的chm帮助文件路径. 这样在 ...
- Vue源码翻译之组件初始化。
废话不多说. 我们先来看看Vue的入口文件. import { initMixin } from './init' import { stateMixin } from './state' impor ...
- chromium浏览器开发系列第三篇:chromium源码目录结构
上两篇介绍了下载源码和编译源码,这次主要介绍chromium的源码目录结构,我也是通过源码和官网结合来跟大家说,如果有说的不准确的,欢迎交流. 另外,官网的不一定准确,他们其实也很懒,所以最主要还是靠 ...