C# _列表(List<T>)_ 字典(Dictionary<TKey, TValue>)
目录
列表(List)
特点
创建列表
RemoveAll 删除与之条件相匹配的数据 会返回删除的个数
Capacity 获取或设置列表的容量
更多方法可参照上篇文章:C#_ArrayList动态数组
字典(Dictionary)
特点
定义一个字典
向字典中添加数据Add
获取字典中储存的数据个数Count
使用索引器可以访问字典中的某个数据
ContainsKey(); 判断字典中是否包含某个 键
ContainsValue(); 判断字典中是否包含某个 值
列表与字典的选择
练习
在 C# 中,列表(List)和字典(Dictionary)是两种常用的集合类型,用于存储和管理数据。它们各有特点,适用于不同的场景。
列表(List<T>)
List<T>
是一种动态数组,它可以存储相同类型的元素,并且可以动态调整大小。
列表是属于集合类里面的 , 集合类:用来储存一堆数据的 是数据的集合 列表:只是集合中的一种储存数据的表达方式
特点:
- 元素按顺序存储,可通过索引访问
- 允许存储重复元素
- 查找元素需要遍历(除非知道索引)
- 适合需要按顺序访问元素的场景
创建列表
List列表属于是泛型类 列表在创建的时候是可以给他一些初始值的 在()后面跟上{}里面写数据
跟数组差不多 但是数组的长度是固定的 列表是可以添加数据的 长度也是不固定的
// 创建了一个 操作整数类型的列表List<int> list = new List<int>() { 10, 212, 423, 124, 855, 546, 17, 528 };// 创建了一个 操作字符串类型的列表
List<string> liststr = new List<string>();
// Add末尾添加数据
liststr.Add("张三");
liststr.Add("李四");
RemoveAll 删除与之条件相匹配的数据 会返回删除的个数
internal class Program{static void Main(string[] args){List<string> liststr = new List<string>() { "张三", "李四", "李四", "李四", "李四", "李四" ,"王五"};//RemoveAll 删除与之条件相匹配的数据 会返回删除的个数 //定义a记录删除个数int a = liststr.RemoveAll(EndsWithSaurus);//显示列表内容Console.WriteLine(a);foreach (string item in liststr){Console.WriteLine(item);}}private static bool EndsWithSaurus(String s){return s.EndsWith("李四");}}
运行结果
Capacity 获取或设置列表的容量
列表的内部数据在储存是其实也是使用的数组 一个空的列表会有一个长度为0的数组 当给列表添加数据的时候 默认情况下 列表的容量会扩大为4 如果添加第5个数据就会扩容为8 ....倍增 如果自己设置了容量 就会根据设定的值倍增 当列表的容量发生变化时 会重新创建新的数组 Array.Copy() 将旧数组中的数据复制到新数组里面来
List<int> listint = new List<int>();空的列表。长度起始为0,后期加入数据会自动扩大空间0->4->8->16->...->n*2
Console.WriteLine(listint.Capacity);长度起始为10,后期加入数据会自动扩大空间20->40->80->160->...->n*2
listint.Capacity = 10;
Console.WriteLine(listint.Capacity);
更多方法可参照上篇文章:C#_ArrayList动态数组
字典(Dictionary<TKey, TValue>)
Dictionary<TKey, TValue>
是一种键值对集合,每个元素都由一个键(Key)和一个值(Value)组成。
字典的作用:一般用于一些信息的记录 用字典储存的数据可以快速的查询
字典: 类似于List 只能储存类型固定的数据 长度不固定
List 使用索引进行数据的操作 字典要使用"键"进行数据操作
键: 标识,在一个字典中 键是唯一的 并且不能为null,如"姓名": 张三 "年龄":18 "性别":男
特点:
- 元素以键值对形式存储
- 键必须唯一,值可以重复
- 通过键可以快速查找对应的值
- 适合需要通过键快速访问数据的场景
定义一个字典
格式:Dictionary<键的数据类型,值的数据类型> 变量 = new Dictionary <键的数据类型,值的数据类型>();
//在创建字典是 可以给一些初始数据Dictionary<string,int> keyValuePairs = new Dictionary<string, int>() {{"Name",666},{"sex" , 1 },{"年龄",18 }};
向字典中添加数据Add
获取字典中储存的数据个数Count
//向字典中添加数据 AddkeyValuePairs.Add("身高", 178);// 获取字典中储存的数据个数Console.WriteLine(keyValuePairs.Count);
使用索引器可以访问字典中的某个数据
// 使用索引器Console.WriteLine(keyValuePairs["Name"]);//修改键为Name的数据值keyValuePairs["Name"] = 888;
ContainsKey(); 判断字典中是否包含某个 键
ContainsValue(); 判断字典中是否包含某个 值
//判断字典中是否包含某个 键
Console.WriteLine(keyValuePairs.ContainsKey("吴凡"));
//判断字典中是否包含某个 值
Console.WriteLine(keyValuePairs.ContainsValue(888));
列表与字典的选择
- 当需要按顺序存储和访问元素时,选择
List<T>
- 当需要通过唯一标识符(键)快速查找数据时,选择
Dictionary<TKey, TValue>
- 列表的查找时间复杂度是 O (n),而字典的查找时间复杂度接近 O (1)
特性 | List<T>(列表) | Dictionary<TKey, TValue>(字典) |
---|---|---|
存储结构 | 线性存储相同类型的元素 | 键值对(Key-Value)形式存储 |
访问方式 | 通过索引(int 类型)访问 | 通过键(TKey 类型)访问 |
元素唯一性 | 允许重复元素 | 键(Key)必须唯一,值(Value)可重复 |
查找效率 | 需遍历查找(已知索引时为 O (1),否则为 O (n)) | 通过键查找效率高,接近 O (1) |
适用场景 | 需要按顺序访问、存储一组相同类型数据 | 需要通过唯一标识快速查询、修改数据 |
元素顺序 | 保持插入顺序 | 不保证元素顺序(.NET Core 3.0+ 部分实现保留插入顺序) |
核心操作 | Add、Insert、Remove、IndexOf 等 | Add、ContainsKey、Remove、TryGetValue 等 |
内存占用 | 相对较少 | 相对较多(需额外存储键的哈希信息) |
通过上述对比可以看出,List<T> 更适合处理有序数据集合,而 Dictionary<TKey, TValue> 则在需要快速键值查找的场景中更具优势,实际开发中可根据具体需求选择合适的集合类型。
在实际开发中,这两种集合类型经常结合使用,例如 List<Dictionary<string, object>>
可以用来表示一组具有多个属性的对象。
练习:
把数据存储到字典中.用户输入需要查询的省份,打印对应的市,如:
输入:河北省 显示 :石家庄市 唐山市
输入:山西省 显示 :太原市 大同市
输入:河南省 显示 :郑州市 南阳市
//创建一个空字典 Dictionary<string, List<string>> dic = new Dictionary<string, List<string>>();//以下三种在字典添加数据的方式 List<string> list = new List<string>() { "郑州市","商丘市"}; dic.Add("河南省", list);dic.Add("河北省", new List<string>() {"石家庄市","唐山市" });List<string> list1 = new List<string>(); list1.Add("太原市"); list1.Add("大同市"); dic.Add("山西省", list1);
//拿到字典中所有的键 遍历字典 拿到字典中的所有的数据 { "xxxx" : xxxx} foreach (KeyValuePair<string, List<string>> item in dic) {//item 是键和值一起存在的// 可以获取到 字典中当前数据的键Console.WriteLine(item.Key);// 可以获取到 字典中值列表当前数据的数据foreach (string n in item.Value) { Console.WriteLine(n); } }
Console.WriteLine("请输入要查询的省份");string user = Console.ReadLine();//判断 字典中是否包含用户输入的键if (dic.ContainsKey(user)){// 如果存在 就拿到当前键所对应的值// 因为我们在写字典数据时 值的数据使用List列表储存的 所以我们根据键访问的值就是一个列表// 循环列表(dic[user]) 拿到里面每个数据item //dic[user] 通过索引 访问字典中键为user的值foreach (string item in dic[user]){Console.WriteLine(item);}}else{Console.WriteLine("输入省份字典中不存在");}