一、ArrayList集合
C# 中的集合是用来存储、管理一组数据的类。
ArrayList集合跟数组很相似,同样都可以根据下标控制值,但是数组的大小是固定的,而ArrayList集合相当于一个动态的数组,它可以使用方法实现添加删除等操作。但是数组可以是多维的,而ArrayList集合只能是一维的。
看一个案例来使用:
ArrayList集合和类一样,需要先实例化对象。这里的array就是集合的名字,前面的ArrayList则说明这是一个list集合。这里我们从键盘输入,循环存在list集合中。集合的添加就是Add,因为list是一个类,我们就可以使用(.)来调用集合的方法,括号中就填需要写入的内容。
这里集合的遍历一般用foreach,for循环也是可以的。但是我们集合一般是不需要更改值,所以可以直接用foreach遍历。
来看一些比较常用的list方法:
这里的insert代表插入的意思,后面的0指的是下标,这里是从控制台插入一个值到指定下标0处。
remove这里是移除的意思,从list集合中去寻找第一个值为0的,然后将他移除。
而removeat则是在list集合中寻找下标为0的值,并将它移除。
removerange是指从0这个下标开始移除,移除5个。
clear则是将list集合中的所有元素全都移除。
contains则是在这个集合中寻找0这个值是否在集合中,返回true和false。
indexof则是寻找这个集合中第一个找到的值,找到则返回下标或者否则返回-1。
lastindexof就是寻找最后一个。
二、队列Queue
队列和list集合一样都可以存储任意类型的数据,它遵循先进先出的原则,但他不能获得指定位置的数据,只能存入和取出,取出后队列中的元素会自动删除。
队列中的元素只能先进先出,队列的出口端叫做队头,队列的入口端叫做队尾。
这里就创建了一个简单的队列,<string>这个则是对这个队列进行了限制,限制他只能是string类型的元素。(.Enqueue)这里就是入队了,为这个队列添加元素。(.peek)则是查看这个队列的第一个元素,但是不把这个队列删除。出队则直接使用循环读取出来就好了,但是读取出来之后队列中就不会有值了。(.count)这个是查看队列中的元素个数。
Dequeue()这个则是移除并返回队首元素(若队列为空则抛出InvalidOperationException)
clear()则是清空所有元素。
三、栈
栈和前面的list一样都是存放数据的,但是这个得遵守先进后出的原则。他和队列一样不能获得指定位置的数据,只能存入和取出,取出后栈中的元素会自动删除。
先实例化对象,push就是将括号中的string类型的元素压入栈中。count则是查看栈中的数量。peek则是查看栈顶的元素。pop就会将栈中的元素一个一个弹出栈。count是查看栈中剩余的元素数量。
四、泛型
了解泛型就得先了解装箱和拆箱,首先所有的值类型和引用类型的基类是object类型。而装箱则是将值类型转换为引用类型,拆箱就是将引用类型转换为值类型。用装箱拆箱就可以做到类型之间相互切换。
而泛型则是我们在处理不同数据但比较相似的代码时就可以使用。它可以使代码更加通用,避免代码冗余。
这就是一个泛型方法的用法,下面再math1类中定义了一个add的泛型方法,其中的值的类型是T类型。然后在main方法中测试,先实例化对象,然后调用add这个方法,但是传入的数据类型是不同的,得到的数据类型也会不同。
泛型方法可以将不同类型的数据放在同一个泛型方法中运行。
而这里就是泛型类的案例,这里创建了一个泛型类,里面的字段_item也是泛型的,我们使用get方法和put方法来实现不同类型值在泛型类中通过方法来传递。
泛型约束:泛型约束是为了让他对指定的类型来使用,比如where T : struct,这个就是为了只让值类型数据使用。
这里就对add这个泛型方法进行了限制。只能输入值类型的数据。
如果使用了string类型就会报错,因为被限制了。
五、字典
字典是键值对的集合(key,value)。在字典中键(key)不可重复并且不能为空,但是值(value)可以为空。例:
Dictionary<string, int> ageDict = new Dictionary<string, int>();
这一句就是创建了一个字典,<>中的string代表了键的类型,后面int代表了值的类型。
在字典中的添加就使用Add(键,值),如果键已存在会抛出ArgumentException。
字典中的键就相当于数组中的下标,可以直接用([键])来找到对应的值。
TryGetValue则是查看这个字典中是不是有这个键,如果没有就会抛出异常。
remove则可以通过键来删除字典中的元素。
遍历整个字典我们通常使用foreach。它可以直接读取字典中的键或者值。
六、异常
之前我们编写程序时会常常出现bug,这会直接导致程序还未进行完就奔溃。为了不让这程序直接奔溃,我们就需要使用到异常,让他抛出异常原因而不是奔溃程序。
ExceptionTest exceptionTest = new ExceptionTest();
这里我们得先实例化对象,然后才能调用里面的异常。
throw 是主动抛出异常,执行到这个语句时会停止之后的代码进行,会寻找就近的try catch语句来进行异常处理。如果没有try catch 语句则会程序奔溃。
try中放入的是有可能出现异常的代码,而catch则是处理异常的代码。
finally用于资源的释放,避免程序奔溃导致资源泄露。
catch可以在后面继续添加,因为可能不止一个异常,所以需要多重处理。