常用集合类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z6TBC4iJ-1681116581092)(C:\Users\CoreDawg\AppData\Roaming\Typora\typora-user-images\image-20230410121503304.png)]
Array/数组类
方法
Array 类的方法
下表列出了 Array 类中一些最常用的方法:
序号 | 方法 & 描述 |
---|---|
1 | Clear 根据元素的类型,设置数组中某个范围的元素为零、为 false 或者为 null。 |
2 | Copy(Array, Array, Int32) 从数组的第一个元素开始复制某个范围的元素到另一个数组的第一个元素位置。长度由一个 32 位整数指定。 |
3 | CopyTo(Array, Int32) 从当前的一维数组中复制所有的元素到一个指定的一维数组的指定索引位置。索引由一个 32 位整数指定。 |
4 | GetLength 获取一个 32 位整数,该值表示指定维度的数组中的元素总数。 |
5 | GetLongLength 获取一个 64 位整数,该值表示指定维度的数组中的元素总数。 |
6 | GetLowerBound 获取数组中指定维度的下界。 |
7 | GetType 获取当前实例的类型。从对象(Object)继承。 |
8 | GetUpperBound 获取数组中指定维度的上界。 |
9 | GetValue(Int32) 获取一维数组中指定位置的值。索引由一个 32 位整数指定。 |
10 | IndexOf(Array, Object) 搜索指定的对象,返回整个一维数组中第一次出现的索引。 |
11 | Reverse(Array) 逆转整个一维数组中元素的顺序。 |
12 | SetValue(Object, Int32) 给一维数组中指定位置的元素设置值。索引由一个 32 位整数指定。 |
13 | Sort(Array) 使用数组的每个元素的 IComparable 实现来排序整个一维数组中的元素。 |
14 | ToString 返回一个表示当前对象的字符串。从对象(Object)继承。 |
静态方法和实例方法的区分
说明:静态方法直接通过Array类调用
实例方法通过数组调用
int[] list = { 34, 11, 55, 31, 841, 1, };
list.CopyTo(list, 0);//Copy to就是一个实例方法,可以直接通过数组调用的
CopyTo方法 实例
使用示范
static void Main(string[] args)
{
int[] list1 = { 34, 11, 55, 31, 841, 1, };
int[] list2 = { 34, 1, 5, 3, 81, 1, };//两个数组长度保持一样,数据不同
//把list1里面的数据复制到list2里面
list1.CopyTo(list2, 0);//index索引参数指从几开始复制
PrintValues(list1);
PrintValues(list2);
//两个输出都是
/* 34 11 55 31 841 1
34 11 55 31 841 1*/
}
//遍历数组方法
public static void PrintValues(int[] myArr)
{
foreach (int i in myArr)
{
Console.Write("\t{0}", i);
}
Console.WriteLine();
}
注意复制的时候保证list2的容量/长度是够的
Copy方法 静态
需要用类Array调用
int[] list1 = { 34, 11, 55, 31, 841, 1, };
int[] list2 = { 34, 1, 5, 3, 81, 1, };//两个数组长度保持一样,数据不同
//把list1里面的数据复制到list2里面
//list1.CopyTo(list2, 0);//index索引参数指从几开始复制
Array.Copy(list1, list2, 2);
/* 34 11 55 31 841 1 指定多少索引,就复制多少内容
34 11 5 3 81 1*/
PrintValues(list1);
PrintValues(list2);
GetLength方法 实例
获取长度
IndexOf方法 静态
//索引方法示例
int index = Array.IndexOf(list1, 1);
Console.WriteLine(index);//5
查找特定参数的索引
Sort排序方法 静态
从小到大排序
Array.Sort(list1);
Array.Sort(list2);
/* 1 11 31 34 55 841
1 1 3 5 34 81*/
Reverse逆转方法 静态
//逆转方法
Array.Reverse(list1);
列表类List类的常用方法和属性
- 列表
- 队列
- 字典
- 栈
列表
List
//构造list的方式1
List<string> mList = new List<string>();//空集合
//另一种构造list的方式
//先创建数组,再把数组作为参数传递给list
string[] temArr = {"156302","84","961","gbuyfa","bdvsgfat","sdjas"};
List<string> list2 = new List<string>(temArr);
常用方法演示
增加数据
list2.Add("sda");
输出,需要输出遍历方法
static void PrintValue(List<string> list)
{
foreach(string item in list)
{
Console.WriteLine(item + " ");
}
Console.WriteLine();
}
输出
list2.Add("sda");
PrintValue(list2);
获取最大容量和获取当前数据个数
Console.WriteLine(list2.Capacity);//12 最大容量
Console.WriteLine(list2.Count);//7 数据的个数
插入方法
list2.Insert(3, "sdaidha");
PrintValue(list2);
删除方法
//删除方法
list2.Remove("84");
PrintValue(list2);
按索引删除
//按索引删除
list2.RemoveAt(1);//删掉84
PrintValue(list2);
范围删除
//范围删除
list2.RemoveRange(0, 3);
PrintValue(list2);
定位方法
//定位方法
int a=list2.IndexOf("84");//定位序列位置
Console.WriteLine(a);
如果数据不存在就会返回-1
方向查找定位
从后面向前查找,返回的也是索引
关键词是 LastIndexOf
说明:如果列表里有重复元素的话,那么这个方法就有用了
只判断存在的方法
//判断是否存在
bool isExit = list2.Contains("84");
Console.WriteLine(isExit);//True
字典类Dictionary类的介绍和常用方法和属性
- Hashtable哈希表
- Dictionary<TKey,Value>字典
//区别在于字典必须指定泛型,其实差不多
键值对 Key-value
id - 身份信息
字典的创建
//字典的创建
Dictionary<int, string> studentDB = new Dictionary<int, string>();//创建了一个空字典
添加数据
//添加数据
studentDB.Add(1, "张三,男 20 天津 XXXX");
studentDB.Add(1, "李四,女 20 天津 XXXX");
studentDB.Add(1, "萌萌人,男 99 天津 XXXX");
注意键值不能相同
查找数据
//查找数据
string value = studentDB[1];
Console.WriteLine(value);
判断是否存在
//先判断存在的情况
if (studentDB.ContainsKey(5))//小括号里的key是需要验证的key
{
string value1 = studentDB[1];
Console.WriteLine(value);
}
else
{
Console.WriteLine("这个Key不存在");
}
字典里的Key不能重复,但Value能
studentDB.Add(1, "张三,男 20 天津 XXXX");
studentDB.Add(2, "张三,男 20 天津 XXXX");
遍历数据,键值对遍历
//遍历键值和数据
foreach (KeyValuePair<int, string> kvp in studentDB)
{
Console.WriteLine(kvp.Key + " " + kvp.Value);
}
//只遍历键值
Dictionary<int, string>.KeyCollection keycollection = studentDB.Keys;
foreach(int key in keycollection)
{
Console.WriteLine(key);
}
只遍历所有的值
//只遍历值
Dictionary<int, string>.ValueCollection valuecollection = studentDB.Values;//也是先定义一个集合
foreach(string value in valuecollection)
{
Console.WriteLine(value);
}
删除数据
//删除数据
studentDB.Remove(2);
Dictionary<int, string>.ValueCollection valuecollection = studentDB.Values;//也是先定义一个集合
foreach (string value in valuecollection)
{
Console.WriteLine(value);
}
用字典存储游戏道具
先创建一个游戏道具类
class item
{
public int Id { get; set; }
public string Name { get; set; }//治疗药水,魔法药水,敏捷药水
public int Hp { get; set; }
public int Mp { get; set; }
public int Speed { get; set; }
//道具的构造方法
public item(int id,string name,int Hp,int Mp,int Speed)
{
this.Id = id;
this.Name = name;
this.Hp = Hp;
this.Mp = Mp;
this.Speed = Speed;
}
}
使用字典
先创建字典,在创建物品
Dictionary<int, item> ItemDict = new Dictionary<int, item>();
ItemDict.Add(1001, new item(1001,"治疗药水", 100, 0, 0));
ItemDict.Add(1002, new item(1002,"魔法药水", 0, 100, 0));
ItemDict.Add(1002, new item(1002,"敏捷药水", 0, 0, 100));
什么是栈Stack和队列
创建栈
//创建栈
Stack<int> ts = new Stack<int>();
像栈里存储数据 入栈 Push
//向栈里存储数据 入栈
ts.Push(1);
ts.Push(2);
ts.Push(3);
ts.Push(4);
通过遍历栈看数据情况
//遍历
foreach(int i in ts)
{
Console.WriteLine(i);//4 3 2 1
}
输出的数据是反序的,因为对栈来说,会从栈顶来取,而最后放入的数据就在栈顶
取数据 出栈 Peek和Pop
Peek
int res =ts.Peek();//获取栈顶的数据
Console.WriteLine(res);//4
Peek即使多次调用,也只能获得栈顶的数据
Pop
//出栈
int res2 = ts.Pop();//从上往下一次拿出一个数据
int res3 = ts.Pop();
int res4 = ts.Pop();
//int res5=ts.Pop();
Console.WriteLine(res2);//4
Console.WriteLine(res3);//3
Console.WriteLine(res4);//2
//Console.WriteLine(res5);//1
Console.WriteLine();//换行
//输出剩余的数据
foreach (int i in ts)
{
Console.WriteLine(i);
}
/*4 输出结果
3
2
1
*
*/
区别:Peek不会移除栈的数据,Pop会移除栈的数据
清空Clear
//清空
ts.Clear();
foreach(int i in ts)
{
Console.WriteLine(i);//Clear 之后,输出为空,里面就没数据了
}
Contains是否包含
//contains,判断是否包含数据
Console.WriteLine(ts.Contains(4));//True
Console.WriteLine(ts.Contains(99));//False
Count取得数据个数
//Count取得数据个数
Console.WriteLine(ts.Count);//4
队列
基础创建队列
增加数据Enqueue
//创建队列
Queue<int> q = new Queue<int>();
//添加数据
q.Enqueue(1);
q.Enqueue(2);
q.Enqueue(3);
q.Enqueue(4);
//遍历
foreach(int i in q)
{
Console.WriteLine(i);//1 2 3 4
}
队列是从队头遍历到队尾的
Clear方法
没啥好说的,就也是清楚数据
q.Clear();
//遍历
foreach(int i in q)
{
Console.WriteLine(i);//清空之后再遍历的结果是啥都没有
}
取数据 出队
Peek
//Peek
int a = q.Peek();//只能看到队头,就算重复多次得到的结果也是队头
int b = q.Peek();
Console.WriteLine(a);
Console.WriteLine(b);
Dequeue出队
//出队
int a=q.Dequeue();
int b=q.Dequeue();
int c=q.Dequeue();
Console.WriteLine(a);//1
Console.WriteLine(b);//2
Console.WriteLine(c);//3
Console.WriteLine();//换行
//查看队伍剩余的数据
foreach(int i in q)
{
Console.WriteLine(i);//4
}
判断是否包含Contains
//包含
Console.WriteLine(q.Contains(5));//False
Console.WriteLine(q.Contains(3));//True
Count取得所有数据个数
Console.WriteLine(q.Count);//4
int c=q.Dequeue();
Console.WriteLine(a);//1
Console.WriteLine(b);//2
Console.WriteLine(c);//3
Console.WriteLine();//换行
//查看队伍剩余的数据
foreach(int i in q)
{
Console.WriteLine(i);//4
}
#### 判断是否包含Contains
~~~C#
//包含
Console.WriteLine(q.Contains(5));//False
Console.WriteLine(q.Contains(3));//True
Count取得所有数据个数
Console.WriteLine(q.Count);//4