.net 下的集合

集合的操作在编码的时候很常见。但是由于经常使用几种集合。而忽略了一些不常用的集合。在这里我整理下。

首先先了解下接口:

1、IEnumerable,返回一个循环访问集合的枚举器。

2、IEnumerable<T>,返回一个循环访问指定集合T的枚举器。

3、ICollection,在IEnumerable基础上,增加了是否同步操作中、支持同步操作、可以拿到数量、拷贝到另外一个集合的方法。

4、ICollection<T>,是ICollection的泛型。并且多了新增,清除,包含等接口方法。

5、IList,在继承原来的接口上,新增了索引器、集合是否可读、插入、移除接口方法。

6、IList<T>,是IList接口的泛型,功能都有,只是有些功能在ICollection<T>里实现了。

7、IReadOnlyCollection<T>,提供一个强类型的只读元素集合接口。

 8、IReadOnlyList<T>,在IReadOnlyCollection<T>接口基础上增加了索引。

 9、IDictionary,以 键/值对 来存储的接口。

 10、ISet<T>,基于继承的接口之上,新增了ExceptWith(从当前集内移除指定集合中的所有元素)、IntersectWith(修改当前集,使该集仅包含指定集合中也存在的元素)、IsProperSubsetOf(确定当前集是否为指定集合的属性子集)、IsProperSupersetOf(确定当前集是否为指定集合的正确超集)、IsSubsetOf(确定一个集是否为指定集合的子集)、IsSupersetOf(确定当前集是否为指定集合的超集)、Overlaps(确定当前集是否与指定的集合重叠)、SymmetricExceptWith(修改当前集,使该集仅包含当前集或指定集合中存在的元素,但不可包含两者共有的元素)、UnionWith(修改当前集,使该集包含当前集和指定集合中同时存在的所有元素)。

一、在System.Collections命名空间下的集合有:

1、ArrayList。

ArrayList集合继承的接口有IList, ICollection, IEnumerable, ICloneable。从继承的接口来看,存放的是object类型的集合。支持集合的同步、克隆等操作。与数组不同的是,数组是固定大小的,而集合是可变长的。

2、BitArray。

BitArray是一个密封类,管理一个紧凑型的位值数组,继承于ICollection, IEnumerable, ICloneable三个接口。和ArrayList不同的是他存放的是byte[]。

3、Queue、

队列,继承ICollection, IEnumerable, ICloneable这三个接口。队列代表着 先进先出(FIFO)的集合,传入的是object对象。支持同步操作。

4、Stack

堆栈,继承ICollection, IEnumerable, ICloneable三个接口,代表着后进先出(LIFO)的集合,传入的是object对象。支持同步操作。

5、SortedList、

排序列表,是按照键/值对来排序的集合。继承于IDictionary, ICollection, IEnumerable, ICloneable这4个接口,从add方法中 public virtual void Add(object key, object value),看出添加的是键和值,值可以通过索引来获取。每添加一个键值对,就会按照键作为升序排序。

6、Hashtable

哈希表,也是键/值对集合。继承于IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback, ICloneable6个接口,和SortedList不同的是当用键访问元素时是使用的哈希表,也就是添加键值对的时候,键是通过哈希算法获得的唯一值,但是在添加key的时候是不引许添加重复的key,这样的转换过的键也就不能够直接排序了。但可以通过ArrayList来排序(new ArrayList(hashtable.keys).Sort())。

二、在System.Collections.Generic命名空间下的集合有:

1、Dictionary<TKey, TValue>

字典,键值对集合,继承的接口有:IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IReadOnlyDictionary<TKey, TValue>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable, ISerializable, IDeserializationCallback,其中KeyValuePair是struct类型用来存key/value值。

2、List<T>

泛型集合。继承的接口有IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable 8个接口,里面有public int BinarySearch(T item)方法 ,该方法是在集合查找该元素,返回从零开始的索引,然而它需要使用一个排过序的集合,来通过二分查找来查询,而Find、Contains、indexOf方法都是线性查找,在数据量很大的情况下,二分查找的效率比线性查找快,因为它的复杂度为O(logn)。

3、HashSet<T>

 继承于ISerializable, IDeserializationCallback, ISet<T>, ICollection<T>, IEnumerable<T>, IEnumerable 6个接口,和Hashtable不同的是,Hashtable继承的是IDictionary接口,所以存取的是键值对。而HashSet<T>是存取强类型的值。如果集合需要求交集、并集、差集,HashSet<T>比较适合。这里强调下HashSet<T>不接受重复对象的。

4、 LinkedList<T>

链表集合,继承于ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback 6个接口,它和List<T>的不同是,它的添加是类似链表一样,在给定的节点基础上前后添加一个新的节点值。方法有AddBefore、AddAfter、AddFirst、AddLast等,第一次添加的时候是用AddFirst方法或者传入构造函数里面。

5、Queue<T>

泛型队列,继承于IEnumerable<T>, ICollection, IEnumerable 3个接口,和Queue不同的是,一个是泛型(强类型),一个是object类型(存取需要拆箱、装箱),且在多线程的情况下需要自己实现同步操作。

6、Stack<T>

泛型堆栈,继承于IEnumerable<T>, ICollection, IEnumerable 3个接口,和Stack不同的也是泛型和非泛型的区别,且在多线程的情况下需要自己实现同步操作。

7、SortedList<TKey, TValue>

键值对集合,继承于 IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable 6个接口,是泛型的。不可以添加相同的key,添加后会自动按升序排序。当然可以通过IComparer<TKey>来比较排序。

8、SortedSet<T>

带有排序的集合,继承于ISet<T>, ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback 7个接口,和HashSet<T> 类似,只是添加值后会自动排序。

9、SortedDictionary<TKey, TValue>

带有排序的键值对集合,继承于 IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable 6个接口,通过构造函数传入比较器来自定义排序。

10、KeyedByTypeCollection<TItem>

在 程序集 System.ServiceModel下,提供一个集合,该集合的项是用作键的类型,继承的是KeyedCollection<TKey, TItem>抽象类而KeyedCollection<TKey, TItem>继承的是Collection<T>类。

11、SynchronizedCollection<T>

在程序集 System.ServiceModel 下,继承于IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable 6个接口,提供一个线程安全集合,其中包含泛型参数所指定类型的对象作为元素,构造函数里面可以传入同步线程安全的对象。

12、SynchronizedReadOnlyCollection<T>

在程序集 System.ServiceModel 下,继承于 IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable 6个接口,提供一个线程安全只读集合,该集合包含泛型参数所指定的类型的对象作为元素,构造函数里面可以传入同步线程安全的对象。

三、在System.Collections.Concurrent命名空间下有:

该命名空间下提供多个线程安全集合类,但是用多线程并发访问集合时,应该使用这些类。注意:只有.net Framework 4及以上才有

1、ConcurrentDictionary<TKey, TValue>

表示可由多个线程同时访问的键值对的线程安全集合,比Dictionary<TKey, TValue> 多了几个TryAdd、TryRemove、TryUpdate等方法。

2、ConcurrentQueue<T>

表示线程安全的先进先出(FIFO)集合。

3、ConcurrentStack<T>

表示线程安全的后进先出(LIFO)集合

4、BlockingCollection<T>

为实现IProducerConsumerCollection<T>的线程安全集合提供阻塞和限制功能。

5、ConcurrentBag<T>

 表示对象的线程安全的无序集合,

四 在System.Collections.ObjectModel命名空间下有:

1、ReadOnlyCollection<T>

提供泛型只读集合的基类

2、ObservableCollection<T>

主要在WPF中使用,但添加、删除或刷新整个列表时,此集合将提供通知。继承于Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged。

3、ReadOnlyObservableCollection<T>

只读的ObservableCollection<T>。

转载于:https://www.cnblogs.com/dingli/p/6531729.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aspects_具有Aspects的Java中的Mixin –用于Scala特性示例

aspectsScala特征允许将新行为混合到一个类中。 考虑两个特征&#xff0c;可以向JPA实体添加审核和与版本相关的字段&#xff1a; package mvcsample.domainimport javax.persistence.Version import scala.reflect.BeanProperty import java.util.Datetrait Versionable {Ver…

TCP服务端实现并发

socket 在 tcp 协议下通信 客户端 import socket ​ # 创建客户端TCP协议通信 c socket.socket() # 与指定服务端握手 c.connect((127.0.0.1, 8080)) ​ # 通信循环 while True:# 向服务端发送信息msg input(>>>)if len(msg) 0:continuec.send(msg.encode(utf-8))#…

问题 1052: [编程入门]链表合并

题目描述已有a、b两个链表&#xff0c;每个链表中的结点包括学号、成绩。要求把两个链表合并&#xff0c;按学号升序排列。 输入第一行&#xff0c;a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成 输出按照学号…

ssh 看apache_使用Apache KeyedObjectPool的ssh连接池

ssh 看apache我发现org.apache.commons.pool非常有用且健壮&#xff0c;但没有充分记录。 因此&#xff0c;我将在这里帮助您解释如何使用Apache KeyedObjectPool 。 什么是KeyedObjectPool &#xff1f; 它是一个映射&#xff0c;其中包含多种类型的实例池。 可以使用任意键访…

问题 1066: 2004年秋浙江省计算机等级考试二级C 编程题(2)

题目描述输入一个正数x和一个正整数n&#xff0c;求下列算式的值。要求定义两个调用函数&#xff1a;fact(n)计算n的阶乘&#xff1b;mypow(x,n)计算x的n次幂&#xff08;即xn&#xff09;&#xff0c;两个函数的返回值类型是double。 x - x2/2! x3/3! ... (-1)n-1xn/n! 输出…

Ubuntu16.04下安装多版本cuda和cudnn

Ubuntu16.04下安装多版本cuda和cudnn 原文 https://blog.csdn.net/tunhuzhuang1836/article/details/79545625 前言因为之前针对Pytorch&#xff0c;caffe&#xff0c;torch等&#xff0c;装了cuda8.0和对应cudnn5.1&#xff0c;但是最近在装MxNet的时候&#xff0c;发现官网上…

什么是javax.ws.rs.core.context? [ 第1部分 ]

如何使用Context批注 JAX-RS API提供了一种非常方便的机制&#xff0c;可以将各种有用的资源&#xff08;例如HTTP标头&#xff09;注入到端点中。 Context注释是一个通用注释&#xff0c;它注入以下对象的实例&#xff1a; HttpHeaders- > HTTP标头参数和值 UriInfo- >…

spring的事件

理论 异步的实现方式可以使用事件&#xff0c;或者异步执行&#xff1b; spring中自带了事件的支持&#xff0c;核心是ApplicationEventPublisher; 事件包括三个要点&#xff1a; 事件的定义&#xff1b;事件监听的定义&#xff1b;发布事件&#xff1b;实战 代码路径&#xff…

[多项式算法]多项式求逆 学习笔记

多项式求逆 和整数的乘法逆元定义类似&#xff0c;对于多项式\(A(x)B(x)1\)&#xff0c;则称\(A(x),B(x)\)互为乘法逆元。 \(A(x)\)存在乘法逆元的充要条件是\([x^0]A(x)\)存在乘法逆元。 现在思考如何用\(O(n\log n)\)的时间计算\(A(x)\)的乘法逆元&#xff1a; 考虑倍增&…

java jax-rs_在Java EE 6中将Bean验证与JAX-RS集成

java jax-rsJavaBeans验证&#xff08;Bean验证&#xff09;是Java EE 6平台的一部分提供的新验证模型。 约束通过以JavaBeans组件&#xff08;例如托管Bean&#xff09;的字段&#xff0c;方法或类上的注释形式的约束来支持Bean验证模型。 javax.validation.constraints包中提…

ubuntu16.04+cuda9.0_cudnn7.5+tensorflow-gpu==1.12.0

1、查找可用的tensorflow源&#xff0c;该命令运行后终端会输出所有可用的源 anaconda search -t conda tensorflow2、这里name是上一步中输出源的tensorflow name栏的名称&#xff0c;show命令会在终端输出该源具体的信息和下载需要的指令,执行后如图&#xff1a; anaconda sh…

介绍OpenHub框架

本文介绍了OpenHub框架 -基于Apache Camel的新的开源集成解决方案。 本文回答了一些问题&#xff0c;为什么您应该关心另一个集成框架&#xff0c;强弱属性以及如何使用OpenHub启动新项目。 OpenHub框架是Apache Camel&#xff0c;但经过改进…… 当然&#xff0c;您只能使用A…

问题 1072: 汽水瓶

题目描述有这样一道智力题&#xff1a;“某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶&#xff0c;她最多可以换多少瓶汽水喝&#xff1f;”答案是5瓶&#xff0c;方法如下&#xff1a;先用9个空瓶子换3瓶汽水&#xff0c;喝掉3瓶满的&#xff0…

呼叫我或异步REST

本文是使用Spring Boot Java 8创建的工作正常的异步REST应用程序的非常简单的示例。SpringBoot使得开发Web应用程序几乎非常容易&#xff0c;但是为了简化任务&#xff0c;我从Spring存储库中举了一个例子&#xff0c;称为rest- service &#xff0c;将其分叉到我自己的存储库…

NOIP模拟测试22「位运算」

范围n-----$100000$ m $30$ 输出方案 这是一个很好的$dp$题 首先我们应该看出来一条性质只要你最后有方案达到$n$个$1$&#xff0c;那么你可以达到任何一种$n$个$1$的情况 例如 你最后可以达到$3$个$1$ 那么你可以达到$11100 $ $ 01110$ $01011$ $01101$等方案 证明&a…

系统测试集成测试单元测试_等待正确的时刻–集成测试

系统测试集成测试单元测试当您必须测试多线程程序时&#xff0c;总是需要等到系统达到特定状态为止&#xff0c;此时测试可以验证是否已达到正确的状态。 这样做的通常方法是在系统中插入一个“探针”&#xff0c;该探针将向同步原语发出信号 &#xff08;例如Semaphore &…

Apollo的基本概念和集成实战

基本概念 使用场景 是一个分布式的配置中心。适用于微服务&#xff1b; 核心功能 集中管理不同环境&#xff0c;不同集群的配置&#xff1b;配置修改后可以实时推送到应用端&#xff1b;具备规范的权限&#xff0c;流程治理特性&#xff1b;开发技术 服务端使用springboot,spri…

flatMap()和事件顺序– RxJava常见问题解答

正如我们已经发现的&#xff0c; flatMap()不会保留原始流的顺序。 让我们使用上一篇文章的GeoNames API示例进行说明 &#xff1a; public interface GeoNames {Flowable<Long> populationOf(String city);}通过使用flatMap()请求多个城市的人口&#xff0c;我们不能保…

技术管理规划-从哪入手?

前言 最近在学习技术管理课程&#xff0c;对学习的内容做一些笔记&#xff0c;结合当前的工作环境在对应的知识点上做一些思考&#xff0c;慢慢建立自己的团队管理方法论。 学习方法 早上骑单车的时候或者跑步的时候听音频&#xff0c;熟悉课程内容&#xff1b;仔细阅读文字&am…

NOIP模拟测试23「mine·water·gcd」

mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc.h> using namespace std; //无脑dp #define ll long long #define A 2222222 const ll mod1e97; //设f[x][5][2]为当前是第x个格子,当前填什么 0前面填1后面填 ll f[A][5][2]; /…