目录
目录
Action 无参无返回值 Action<> 多参无返回值 Func<> 多参有返回值
指定类型用List 。不指定类型ze使用ArrayList ,它里面装的是Object,可以存放任意数据。(需要using System.Collections;) 尽量多用List,避免频繁的拆装箱
返回内容“true”的索引号
insert需要指定索引位置和插入的内容
array[1] array.indexof(1) 根据索引返回内容、根据内容返回索引
容量和长度是两个东西
尽量少用。取出时需要拆箱,这也是我没有给它一个标题的原因,了解它的API即可
你把它取出来的时候它是object,所以得拆。好处是什么都能装
练习题:ArrayList
而且不要直接使用Contains,因为传进来的物品数量不一样,不可能相等的
这个练习我缓存了,直接看复习
这种写法的意思是,赋值就按赋值的算,不赋值就是1
重载可以偷懒调用前面的方法,但也需要斟酌该做法是否需要修改上面的方法内容。
后面是栈Stack、队列Queen,这哥仨都需要using System.Collections; 且同样没有类型限制
但这两没法中间拿,只能一个一个出和取也不能查中间
但仍然可以用Contains判断存在
之所以不把判断长度写在while里是为了维持死循环一直去判断,这样后期往里面加消息的时候它也会去输出。不然直接断了,等不到后面
普通列表List<>
哈希表
Hashtable 以前没怎么说过,其实就是键值对
键值都是object类型前面是键名,后面是值
键与键不能重复
查找用键来查找 hashtable[键名]
可以改成任意类型,不管之前是什么
遍历
没办法用for循环去遍历
这个count只能得到长度有多少个数,无法用它进行遍历
Keys Values
接下来的3和4不怎么常用
DictionaryEntry本质是一个键值的结构体
练习题
设置成私有的构造函数外界就不能去新建对象,只能内部新建。
我可以在加的时候创建怪物,而不是一开始就创建怪物,Id就从0开始生成
泛型
可以在实例化的时候把泛型改成别的类型,也可以保持为T(改过一次之后就固定不能再改了)
但是继承的时候要写具体的类型,就不能再写T了尖括号内可以写多个
另外,泛型方法是必须加<>的
这不是泛型方法
这才叫泛型函数,且不能和类的T同名
因为你申明Test2 t2 = new Test2<int>的时候就已经确定了类型,就只能传递固定类型
泛型约束 关键字 where T:
会让里面的类型变得可变,创建时指定
可以写多个约束多个泛型↓
注意某些约束之间可能有冲突
练习题
只要继承了这个基类的就可以使用instance(存在无参公共构造函数)
有时候不能用==判断相等
因为这个列表里面本来存放的也是默认值,有新值进来才等于进来的值
就加一个静态的,可以让它变成唯一的,防止每次都创建一个新列表
每个子类继承它。并实例化的时候都会把自己装进父类里面的这个列表中
字典 DIctionary
只有stack和queue不能用[]
遍历:keys、values、
输入数字,输出汉字大写。dic是一个字典<int,string>
不区分大小写
链表
系统有自带一个LinkedList的双向链表,但这里我们了解一下它的原理,所以自己写逻辑。
注意:这只是个结点 链表在下面
Add方法
头尾一开始相等,指向同一区域。 然后尾结点的下一个变为新结点,新结点更新为当前的尾结点
那么删除呢,node.next=node.next.next 看懂了吗 原来的引用就消失了
Remove方法
如果要删头结点,让下一个结点等于新的头结点就好了。如果没有下一个,尾结点也置空
判断完特殊情况还没有返回,就是普通情况
从头开始遍历,一直找到没有下一个为止,中间发现某个结点的下结点等于传入的值时,让这个结点的下结点等于下结点的下结点,相当于把中间要删的结点给置空了。
else node=node.next
遍历
其实之前已经说了,
总结
经常增删数据,用链表。 增删较少而查找频繁,用顺序表。