当前位置: 首页 > news >正文

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("输入省份字典中不存在");}
http://www.lryc.cn/news/603988.html

相关文章:

  • uniapp 实现全局变量
  • C++与C#实战:FFmpeg屏幕录制开发指南
  • 高级机器学习
  • RTSP协议详解与C++实现实例
  • Witsbb健敏思携手奥运冠军吴敏霞 共启科学分龄育儿新时代
  • ubuntu22.04 安装 petalinux 2021.1
  • Makefile 快速入门指南
  • 用FunASR轻松实现音频转SRT字幕:完整脚本与解析
  • Jenkins 节点连接故障定位及解决方案总结 - PKIX path validation failed
  • VSCode使用Code Runner运行C/C++输出[Done] exited with code=0 in xxx seconds
  • 第二十五节 MATLAB矩阵的加法和减法、除法(左,右)矩阵
  • Curtain MonGuard 屏幕水印-稳住电子支付企业资料安全线
  • 格雷码的应用场景
  • 【Delphi】快速理解泛型(Generics)
  • 科研小tip3|Windows中的CompressAi下载与使用
  • 【Golang】Go语言指针
  • GO 开发环境安装及配置
  • 【工具】图床完全指南:从选择到搭建的全方位解决方案
  • SBB指令的“生活小剧场“
  • AE、VAE与GAN简明指南:三大生成模型对比
  • 【LoRA微调】采用Lora微调时,假设设置的rank值为8,那么在微调时只会调整秩在8以下的矩阵还是只会调整秩等于8的矩阵
  • PaaS和SaaS的区别
  • JVM知识点(1)
  • 自定义View和动画学习记录 抓娃娃机View
  • 高端医疗超声AFE模拟前端应用
  • 网络安全运维面试准备
  • 背包进一步(多重背包、混合背包)
  • jvm冷门知识十讲
  • Arduino声控RGB矩阵音乐节奏灯DIY全攻略
  • Nuxt3 全栈作品【通用信息管理系统】菜单管理