C#的集合类型及使用技巧
在日常开发过程中,我们不能避免的要对批量数据处理,这时候就要用到集合。集合总体上分为线性集合和非线性集合。线性集合是指元素具有唯一的前驱和后驱的数据结构类型;非线性集合是指有多个前驱和后驱的数据结构类型,如树和图。我们这里主要讲常用的线性集合,常用的线性集合有数组、ArrayList、List、Hashtable(哈希表)、Dictionary(字典)、Stack(堆栈集合)、Queue(队列集合)等。
一、数组
数组是一个存储相同类型元素的固定大小的顺序集合。数组属于引用类型,它继承System.Array类,System.Array是所有数组的基类。
1、一维数组
一维数组声明方式:
//声明一个长度为5的int类型一维数组
int[] numbers = new int[];
一维数组的初始化方式有以下三种写法:
//一维数组的初始化方式
int[] numbers1 = new int[] {,,,,};//指定大小和元素,使用条件是数组大小必须与元素个数相匹配。
int[] numbers2 = new int[] {,,,,};//不指定数组大小,因为编译器会自动统计元素的个数。
int[] numbers3 = { , , , , };//这是更简化的形式,直接使用花括号声明和初始化数组。
访问数组元素:
在声明和初始化数组后,就可以使用索引器访问其中的元素了,数组只支持有整型参数的索引器。索引器总是以0开头,表示第一个元素。注意:如果使用错误的索引器值(其中不存在对应的元素),就会抛出IndexOutOfRangeExcepation类型的异常。
int[] numbers1 = new int[] {,,,,};
int value1 = numbers1[];//获取数组的第一个元素。
如果要循环遍历数组中的元素,可以使用for循环,也可以使用foreach来遍历数组中的元素,两者的区别在于:foreach循环对数组内容进行只读访问,所以不能改变任何元素的值,但是for循环可以给数组元素赋值。
2、多维数组
多维数组包含二维数组、三维数组等等。我们这里以二维数组为例。
二维数组声明方式:
//二维数组的声明方式,
string[,] names = new string[, ];
二维数组初始化方式:
//二维数组的初始化方式
string[,] names1 = { { "a", "b" }, { "c", "d" } };
3、数组的数组
数组的数组声明方式:
//数组的数组声明方式
byte[][] scores = new byte[][];
数组的数组初始化方式:
//数组的数组的初始化方式
int[][] scores1 = { new int[]{,},new int[]{,,,}};
多维数组与数组的数组的差别:多维数组每行长度一致,是固定的;但是数组的数组每行长度是可以不固定。数组在内存中是连续存储的,所以它的索引速度非常快,但也正因为数组在内存中是连续存储的,造成数组必须在声明时指定大小,那么如果声明时数组长度太长,则导致内存浪费;长度太短又会造成数据溢出错误。另外,因为空间连续,插入和删除元素效率比较低,而且麻烦。
二、集合ArrayList和List
1、ArrayList
ArrayList是System.Collections命名空间中定义的非泛型类型的集合。它用于创建动态数组意味着数组的大小根据程序的要求自动增加或减少,不需要指定ArrayList的大小。因为ArrayList是非泛型类型的集合,所以ArrayList既能存储相同类型的元素,也能存储不同类型的元素,故ArrayList不能保证类型安全。
注意:ArrayList的使用需要引入System.Collections命名空间。
ArrayList常用方法:
ArrayList arrayList = new ArrayList();
ArrayList tempArrayList = new ArrayList();
arrayList.Add("abc");//在集合结尾处添加单个元素
arrayList.AddRange(tempArrayList);//在集合结尾处添加指定集合
arrayList.Remove("abc");//移除指定元素(第一个匹配项)
arrayList.RemoveAt();//移除指定索引处元素
arrayList.Contains("cd");//判断指定元素是否存在集合中。
arrayList.Insert(,"kk");//将元素插入指定索引位置
通过ArrayList的Add()方法,我们不难看出向ArrayList集合中添加元素时是以Object类型添加的,也就是说添加进ArrayList集合的所有元素将转换成Object类型。如果我们向ArrayList集合添加的元素是值类型的时候,这个时候将涉及到拆箱和装箱的操作,在我们之前的内容中提到拆箱和装箱是很消耗内存和cpu资源的。另外,即使我们向ArrayList集合添加的元素是引用类型,那么我们在使用时也需要进行类型转换,这个过程也是需要耗费时间和资源的。
2、List
List是一种泛型集合,它是由ArrayList发展而来的集合,在保留ArrayList优点的同时也解决了ArrayList对于值类型需要拆箱和装箱的缺点,并保证类型安全。因此List在声明时就需要指定类型。
注意:List的使用需要引入System.Collections.Generic命名空间。
List常用方法:
List<string> address = new List<string>();//声明一个List
List<string> tempAddress = new List<string>() {"北京","沈阳"};
address.Add("武汉");//在集合结尾处添加单个元素
address.AddRange(tempAddress);//在集合结尾处添加指定集合
address.Remove("沈阳");//移除集合中第一个匹配元素
address.RemoveAt();//移除指定索引处元素
address.Insert(, "湖南");//将元素插入集合指定索引位置
address.Clear();//移除集合中所有元素
address.Contains("湖南");//判断某个元素是否存在集合中
int number = address.Count;//获取集合中元素个数
//List还有很多其它方法,这里就不详细讲解。
通过ArrayList和List的对比,我们在日常开发的过程中,尽量避免使用ArrayList,如果集合的数目固定并且不涉及类型转换,使用数组效率高,否则使用List。
三、Hashtable和Dictionary
C#中的Hashtable和Dictionary都是以键值对形式存储的集合,哈希表未指定类型,会引发类型安全问题,同时使用时也会进行拆箱和装箱操作,比较耗费资源;字典指定类型,故保证类型安全,但字典多线程时不是线程安全的类型,必须人为使用lock语句进行保护,这样效率会大减。哈希表默认是允许单线程写入,多线程读取,故是线程安全类型。
哈希表常用方法:
//哈希表未声明类型,会引发类型安全问题
Hashtable hashtable = new Hashtable();//声明一个哈希表
hashtable.Add(,"北京");//添加带有指定键和值的元素
hashtable.Clear();//移除所有元素
hashtable.ContainsKey();//判断哈希表中是否存在指定键
hashtable.ContainsValue("北京");//判断哈希表中是否存在指定值
hashtable.Remove();//移除指定键的键值对
int hashtableCount = hashtable.Count;//获取哈希表中键值对个数
字典常用方法:
//字典指定数据类型
Dictionary<string, string> dictionary = new Dictionary<string, string>();//声明一个字典
dictionary.Add("张三","");//添加带有指定键和值的元素
dictionary.Clear();//移除所有元素
dictionary.ContainsKey("张三");//判断字典中是否存在指定键
dictionary.ContainsValue("");//判断字典中是否存在指定值
dictionary.Remove("张三");//移除指定键的键值对
int dictionaryCount = dictionary.Count;//获取字典中键值对个数
dictionary.Keys;//获取字典中键的集合
dictionary.Values;//获取字典中值的集合
四、其它常用集合类型
1、队列Queue<T>
队列Queue<T>遵循的是先入先出的模式,它在集合末尾添加元素,在集合的起始位置删除元素。根据队列的特点,可以用它来处理并发命令等场景:先让所有客户端的命令入队,然后,由专门的工作线程来执行队列的命令。在分布式中的消息队列就是一个典型的队列
应用实例。
2、栈Stack<T>
栈Stack<T> 遵循的是后入先出的模式,它在集合末尾添加元素,同时也在集合末尾删除元素。
3、双向链表LinkedList<T>
双向链表LinkedList<T>是一个类型为LinkedListNode的元素对象的集合。当我们觉得在集合中插入和删除数据很慢时,就可以考虑使用链表。双向链表常用方法为AddAfter、AddBefore、AddFirst、AddLast等,双向链表中的每个节点都向前指向Previous节点,向后指向Next节点。
C#的集合类型及使用技巧的更多相关文章
- MySQL数据库数据类型之集合类型SET测试总结
MySQL数据库提供针对字符串存储的一种特殊数据类型:集合类型SET,这种数据类型可以给予我们更多提高性能.降低存储容量和降低程序代码理解的技巧,前面介绍了首先介绍了四种数据类型的特性总结,其后又分别 ...
- java集合类型接口和实现类个人总结
转载:http://blog.csdn.net/qingchunbusanchang/article/details/39576749 java的集合是一个比较综合的概念,相关的知识有很多的博客里面做 ...
- JAVA集合类型详解
一.前言 作为java面试的常客[集合类型]是永恒的话题:在开发中,主要了解具体的使用,没有太多的去关注具体的理论说明,掌握那几种常用的集合类型貌似也就够使用了:导致这一些集合类型的理论有可能经常的忘 ...
- C#集合类型大盘点
C#集体类型( Collections in C#) 集合是.NET FCL(Framework Class Library)中很重要的一部分,也是我们开发当中最常用到的功能之一,几乎是无处不在.俗话 ...
- Python学习笔记——集合类型
集合类型有两种不同的类型——可变集合(set)和不可变集合(frozenset) 可变集合不是可哈希的,不能用作字典的键,也不能用做其他集合中的元素 不可变集合是有哈希值的,能被用做字典的键或者是作为 ...
- Spring中集合类型属性注入
我们都知道如何去注入普通属性的值,非常简单,那么我们如何去注入开发中常见的集合类型的属性了,别急,往下看. 这里将介绍如何给Map list set Array Properties 这些属性注入值. ...
- Redis常用命令入门5:有序集合类型
有序集合类型 上节我们一起学习了集合类型,感受到了redis的强大.现在我们接着学Redis的最后一个类型——有序集合类型. 有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序 ...
- Redis常用命令入门4:集合类型
集合类型 之前我们已经介绍过了最基本的字符串类型.散列类型.列表类型,下面我们一起学习一下集合类型. 集合类型也是体现redis一个比较高价值的一个类型了.因为Redis的集合类型,所以我们可以很容易 ...
- Redis从基础命令到实战之有序集合类型(SortedSet)
有序集合类型是Redis五种数据类型中最高级的.也是最复杂的类型.有序集合具有集合类型的特性,在其基础上给每个元素关联了一个分值,或称为权重,操作时既可以在添加元素时指定分值,也可以单独修改集合中某一 ...
随机推荐
- 【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式
目录 一. 方案1:ThreeBSP.js或ThreeCSG.js扩展库 二. 方案2:平面镂空模型拉伸 三. 方案3:Cinema 4D建模后输出模型文件 示例代码托管在:http://www.gi ...
- selenium基于java 一 软件安装
学习网站 http://www.testclass.net/selenium_java/ 一·安装java环境及eclipse,网上教程较多不讲 二·下载火狐浏览器(旧版) 下载地址:链接: http ...
- Spring 梳理 - ContentNegotiatingViewResolver
ContentNegotiatingViewResolver,这个视图解析器允许你用同样的内容数据来呈现不同的view.它支持如下面描述的三种方式: 1)使用扩展名http://localhost:8 ...
- 阿里云服务器ecs配置之安装nginx
一.简介 Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.它最常的用途是提供反向代理服务. 二 .安装 1.准备工作 Nginx ...
- yzoj P2371 爬山 题解
背景 其实 Kano 曾经到过由乃⼭,当然这名字⼀看⼭主就是 Yuno 嘛.当年 Kano 看见了由乃⼭,内⼼突然涌出了⼀股杜甫会当凌绝顶,⼀览众⼭⼩的 豪⽓,于是毅然决定登⼭.但是 Kano 总是习 ...
- Spring Cloud 版本控制
### 正常版本 ``` org.springframework.boot spring-boot-starter-parent 2.1.7.RELEASE ``` ### SpringCloud 版 ...
- 文件操作——RandomAccessFile
文件操作——RandomAccessFile 构建RandomAccessFileJava提供了一个可以对文件随机访问的操作,访问包括读和写操作.该类名为RandomAccessFile.该类的读 ...
- Python3 学习笔记之 IDLE
IDLE: IDLE是Python标准发行版内置的一个简单小巧的IDE,包括了交互式命令行.编辑器.调试器等基本组件,足以应付大多数简单应用. 基本操作: File->New File 新建立p ...
- python串口助手
最近项目中要使用模拟数据源通过向外发送数据,以前都是用C#编写,最近在研究python,所以就用python写了一个串口助手,方便以后的测试. 在电脑上通过虚拟串口助手产生两个虚拟串口,运行编写的串口 ...
- 【Autofac打标签模式】AutoConfiguration和Bean
[ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki *:first-child { margin-to ...