B站看宝莲灯。人沉香正在那撕心裂肺地哭喊:“我要怎样才能打败我的舅舅啊?!!”
弹幕飘过一行字:你正月里剪个头。
========================手动分割线==========================
一、集合
- 集合提供一种灵活的处理方法。
- 与数组不同,处理的对象组可根据程序更改的需要动态地增长和收缩。
- 对于某些集合,您可以为放入该集合的任何对象分配一个“键”,以便使用该键快速检索对象。
- 注意:集合是类,因此必须声明新集合后,才能向该集合中添加元素。
- 集合分类:非泛型集合和泛型集合
- 使用非泛型集合的需引入:System.Collections命名空间。
- 使用泛型集合需引入:System.Collections.Generic命名空间
1.1 System.Collections 命名空间下的集合类:
- ArrayList:表示大小根据需要动态增加的数组对象
- Hashtable:表示根据键的哈希代码进行组织的键/值对的集合
- Queue:队列,表示对象先进先出(FIFO)
- Stack:栈,表示对象后进先出(LIFO)
1.2 System.Collections.Generic命名空间下的集合类:
- Dictionary
:表示根据键进行组织的键/值对的集合。 - List
:表示课通过索引访问的对象的列表,提供用于对列表进行搜索、排序和修改的方法。 - Queue
:表示对象的先进先出 (FIFO) 集合 - Stack
:表示对象的后进先出 (LIFO) 集合 - SortedList
:表示根据键进行排序的键/值对的集合,而键基于的是相关的IComparer 实现
- 创建数组,回顾之前的知识点:
int[] arr = new int[3]{ 1, 2, 3 };
// 遍历数组
foreach (int temp in arr) {
Console.WriteLine (temp);
}
- 数组的缺点:数组初始化以后,容量固定;数组存储的数据唯一
1.3 ArrayList的使用:
- 实例化一个数组对象
ArrayList arrList = new ArrayList ();
1.3.1 常用方法
- 给数组添加元素(可以添加重复的元素)
arrList.Add (1);
arrList.Add (2.3f);
arrList.Add ("Unity妹子");
arrList.Add (“Untiy妹子");
arrList.Add (3);
arrList.Add (4);
arrList.Add (5);
arrList.Add (6);
2.遍历数组,输出每一个元素(数组元素的类型不统一,所以最好用通用类型var修饰)
foreach (var temp in arrList) {
Console.WriteLine (temp);
}
- 在指定索引位置插入元素(增加一个元素)
arrList.Insert (0, “Unity老汉");
- 移除指定元素的第一个匹配项
arrList.Remove (“Unity妹子");
- 移除指定下标的元素
arrList.RemoveAt (1);
- 将整个集合元素顺序反转
arrList.Reverse ();
- 从给定下标开始,反转指定个数的元素
arrList.Reverse (3, 4);
- 判断是否包含指定的元素
if (arrList.Contains (6)) {
Console.WriteLine ("厉害了,我的哥");
}
- 清除所有元素
arrList.Clear ();
- 集合元素个数
Console.WriteLine ("当前集合元素个数为:" + arrList.Count);
foreach (var temp in arrList) {
Console.WriteLine (temp);
}
1.3.2 ArrayList的特点:
1.支持自动改变大小的功能。
2.可以灵活的插入元素、删除元素、访问元素。
3.不是强类型,速度跟数组比起来要慢。
1.4 Stack栈的使用:
- 初始化对象
Stack sta = new Stack ();
1.4.1 常用方法
- 入栈,将对象插入Stack的顶部
sta.Push ("挖个坑");
sta.Push ("埋点土");
sta.Push ("根");
sta.Push ("茎");
sta.Push ("叶");
// sta.Push (null);//栈内可以放空对象(但null必须要写)
- 出栈,将移除并返回Stack顶部的对象
Console.WriteLine (sta.Pop ());
- 查看,返回位于Stack顶部的对象,但不移除
Console.WriteLine (sta.Peek ());
- 判断指定元素是否在栈中
if (sta.Contains ("根")) {
Console.WriteLine ("根还在");
}
- 移除栈中所以元素
sta.Clear ();
- 获取栈中元素个数
Console.WriteLine ("当前栈中元素个数为:" + sta.Count);
Console.WriteLine ("\n当前栈中元素为:");
foreach (var temp in sta) {
Console.WriteLine (temp);
}
- 将栈转换成数组
object[] objArr = sta.ToArray ();
foreach (var temp in objArr) {
Console.Write (temp + " ");
}
- 将栈中元素拷贝到给定的数组中,需给定开始拷贝的数组索引
object[] arr = new object[10];
sta.CopyTo (arr, 5);
foreach (var temp in arr) {
Console.WriteLine (temp);
}
1.4.2 Stack总结:
1.后进先出(LIFO)的一种数据结构。
2.随着向 Stack 中添加元素,容量通过重新分配按需自动增 加。
3.Stack 接受 null 作为有效值并且允许重复的元素。
1.5 Queue队列的使用
- 实例化对象
Queue que = new Queue ();
1.5.1常用方法
- 将对象添加到 Queue 的结尾处
que.Enqueue ("床前明月光");
que.Enqueue ("疑是地上霜");
que.Enqueue ("举头望明月");
que.Enqueue ("低头思故乡");
- 移除并返回位于 Queue 开始处的对象
Console.WriteLine ("出队列的元素为:" + que.Dequeue ());
- 返回位于 Queue 开始处的对象但不将其移除
Console.WriteLine ("队首元素为:" + que.Peek ());
- 清除队列中的所有元素
que.Clear ();
- 判断队列中是否包含给定的元素
if (que.Contains ("举头望明月")) {
Console.WriteLine ("停车坐爱枫林晚");
}
- 获取队列元素个数
Console.WriteLine ("当前队列元素个数为:" + que.Count);
- 将队列中的数据转换成数组
object[] arrQue = que.ToArray ();
foreach (var temp in arrQue) {
Console.Write (temp + " ");
}
Console.WriteLine ();
foreach (var temp in que) {
Console.WriteLine (temp);
}
1.5.2 队列总结:
1.先进先出(FIFO)的一种数据结构。
2.随着向Queue 中添加元素,容量通过重新分配按需自动增加。 可通过调用 TrimToSize 来减少容量。
3.Queue 接受 null 作为有效值并且允许重复的元素。
4.在AI寻路算法中经常用的Queue。
1.6 Dictionary 字典的使用
用来存储具有一一对应关系的数据的集合
使用Key-Value(键值对)来存储数据
字典中Key是唯一的,Value可以是变量,也可以是对象。
字典是一个泛型集合,实例化的时候,必须指定Key和Value的类型
实例化一个对象
Dictionary dic = new Dictionary ();
1.6.2 常用方法
1.添加键值对
dic.Add ("足疗技师", 98);
dic.Add ("拔罐", 100);
dic.Add ("踩背", 88);
dic.Add ("大宝剑", 76);
dic ["刮痧"] = 120;
- 获取指定的键相对应的值,如果有,就将Key存储到输出参数
int aa = 0;// 定义变量,用户存储Key对应的Value
bool have = dic.TryGetValue ("大宝剑", out aa);
if (have) {
Console.WriteLine ("大宝剑价格:" + aa);
} else {
Console.WriteLine ("大宝剑都没有,差评");
}
- 清除字典中所有的键值对
dic.Clear ();
- 移除指定的键值
dic.Remove ("足疗技师");
- 判断字典中是否包含指定的Key
if (dic.ContainsKey ("踩背")) {
Console.WriteLine ("还不错");
}
- 判断字典中是否包含指定的Value
if (dic.ContainsValue (99)) {
Console.WriteLine ("太贵了");
}
- 字典中键值对的个数
Console.WriteLine ("字典中共有{0}个键值对", dic.Count);
- 获取所有的Key
Dictionary.KeyCollection keys = dic.Keys;
foreach (var temp in keys) {
Console.WriteLine (temp);
}
- 获取所有的Value
Dictionary.ValueCollection values = dic.Values;
foreach (var temp in values) {
Console.WriteLine (temp);
}
foreach (var temp in dic) {
Console.WriteLine (temp.Key + " -- " + temp.Value);
}
练习:用户输入10个姓名,可以重复输入同一个姓名,输出每个姓名,并输出每个姓名输入的多少次。
- 思路:把姓名作为字典的Key,输入次数作为Value;每次输入判断是否已经存在该名字,如果存在就将value 加1,否则新添加
// 初始化字典
Dictionary names = new Dictionary ();
// 创建循环,开始输入姓名
string name = "0";
int count = 0;
while (count < 10) {
name = Console.ReadLine ().ToString ();
Console.WriteLine (name);
int v;
bool have = names.TryGetValue (name, out v);
if (have) {
v++;
names.Remove (name);// 先将原键值对移除
names.Add (name, v);
names [name] = v;
} else {
names.Add (name, 1);
names [name] = 1;
}
count++;
}
foreach (var temp in names) {
Console.WriteLine (temp.Key + "输入了 " + temp.Value + "次");
}
1.7 List类
- 初始化对象
List list = new List ();
1.7.1 常用方法
- 添加元素
list.Add (0);
list.Add (1);
list.Add (0);
// list.Add ("h");
// 添加一个数组
int[] arr = { 9, 9, 8 };
list.AddRange (arr);
- 插入元素在指定索引位置(注意,不能越界)
list.Insert (0, 2);
- 删除指定元素的第一个匹配项
list.Remove (0);
- 删除指定索引的元素
list.RemoveAt (1);
- 移除与指定的谓词所定义的条件相匹配的所有元素(移除能够整除2的元素)
list.RemoveAll (it => it % 2 == 0);
- 将整个数组元素进行反转
list.Reverse ();
- 获取指定元素的下标(第一个匹配项)
Console.WriteLine ("下标为:" + list.IndexOf (9));
- 使用默认比较器对数组进行排序
list.Sort ();
- 判断数组中是否包含给定的元素
Console.WriteLine (list.Contains (8));
- 清除所有元素
list.Clear ();
- 数组元素个数
Console.WriteLine (list.Count);
for (int i = 0; i < list.Count; i++) {
Console.Write (list [i] + " ");
}
1.7.2 List总结
1.于ArrayList相比, List
- 若List
类的类型 T 使用引用类型,则两个类的行为是 完全相同的。 但是,如果对类型 T 使用值类型,则需要考虑 实现和装箱问题。
1.8 哈希表 -- 类似于字典,也是采用键值对的形式来管理数据
- 实例化
Hashtable table = new Hashtable ();
- 添加元素
table.Add (98, "越南新娘");
- 哈希表中不能直接得到值,需要进行里氏转换
string value = (string)table [98];
Console.WriteLine ("哈希表的值是:" + value);
本次讲解就到这里,有关技术问题请小伙伴们添加QQ群:941928511,大家一起探讨!
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明