当前位置: 首页 > 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.xdnf.cn/news/1210645.html

相关文章:

  • uniapp 实现全局变量
  • Rust 实战三 | HTTP 服务开发及 Web 框架推荐
  • React 中获取当前路由信息
  • 2.oracle保姆级安装教程
  • 《零基础入门AI:传统机器学习入门(从理论到Scikit-Learn实践)》
  • 如何解决人工智能在社会治理中面临的技术和伦理挑战?
  • 网络原理--HTTPHTTPS
  • AI产品经理手册(Ch3-5)AI Product Manager‘s Handbook学习笔记
  • PyCharm插件开发与定制指南:打造个性化开发环境
  • FSMC的配置和应用
  • SpringBoot集成deepseek
  • Export useForm doesn‘t exist in target module
  • vue3组件通信的几种方法,详解
  • 05动手学深度学习(下)
  • Linux - 权限的理解(深入浅出,详细细微)
  • 书籍推荐算法研究
  • gRPC性能陷阱:低延迟网络下的客户端瓶颈揭秘
  • Spark SQL 数组函数合集:array_agg、array_contains、array_sort…详解
  • Zynq SOC FPGA嵌入式裸机设计和开发教程自学笔记:GPIO扩展与中断控制技术,万字详解!!
  • 【变更性别】
  • TCPDump实战手册:协议/端口/IP过滤与组合分析指南
  • ESP32学习-1.第一个程序helloworld
  • 子数组和 问题汇总
  • FPGA实现SRIO高速接口与DSP交互,FPGA+DSP异构方案,提供3套工程源码和技术支持
  • Linux_库制作与原理浅理解
  • Python高效历史记录管理:保存最后N个元素的完整指南
  • 【CSS】盒子类型
  • 功率场效应晶体管MOSFET关键指标
  • leaflet中绘制轨迹线的大量轨迹点,解决大量 marker 绑定 tooltip 同时显示导致的性能问题
  • 车载刷写架构 --- 刷写思考扩展