C# _列表(List<T>)_ 字典(Dictionary<TKey, TValue>)

目录

列表(List

特点

创建列表

[RemoveAll 删除与之条件相匹配的数据 会返回删除的个数](#RemoveAll 删除与之条件相匹配的数据 会返回删除的个数)

[Capacity 获取或设置列表的容量](#Capacity 获取或设置列表的容量)

更多方法可参照上篇文章:C#_ArrayList动态数组

字典(Dictionary

特点

定义一个字典

向字典中添加数据Add

获取字典中储存的数据个数Count

使用索引器可以访问字典中的某个数据

[ContainsKey(); 判断字典中是否包含某个 键](#ContainsKey(); 判断字典中是否包含某个 键)

[ContainsValue(); 判断字典中是否包含某个 值](#ContainsValue(); 判断字典中是否包含某个 值)

列表与字典的选择

练习


在 C# 中,列表(List)和字典(Dictionary)是两种常用的集合类型,用于存储和管理数据。它们各有特点,适用于不同的场景。

列表(List<T>)

List<T> 是一种动态数组,它可以存储相同类型的元素,并且可以动态调整大小。

列表是属于集合类里面的 , 集合类: 用来储存一堆数据的 是数据的集合 **列表:**只是集合中的一种储存数据的表达方式

特点

  • 元素按顺序存储,可通过索引访问
  • 允许存储重复元素
  • 查找元素需要遍历(除非知道索引)
  • 适合需要按顺序访问元素的场景

创建列表

List列表属于是泛型类 列表在创建的时候是可以给他一些初始值的 在()后面跟上{}里面写数据

跟数组差不多 但是数组的长度是固定的 列表是可以添加数据的 长度也是不固定的

cs 复制代码
 // 创建了一个 操作整数类型的列表
 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删除与之条件相匹配的数据 会返回删除的个数

cs 复制代码
 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() 将旧数组中的数据复制到新数组里面来

cs 复制代码
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 <键的数据类型,值的数据类型>();

cs 复制代码
 //在创建字典是 可以给一些初始数据
 Dictionary<string,int> keyValuePairs = new Dictionary<string, int>() 
 {
     {"Name",666},
     {"sex" , 1 },
     {"年龄",18 }
 };

向字典中添加数据Add

获取字典中储存的数据个数Count

cs 复制代码
 //向字典中添加数据 Add
 keyValuePairs.Add("身高", 178);

 // 获取字典中储存的数据个数
 Console.WriteLine(keyValuePairs.Count);

使用索引器可以访问字典中的某个数据

cs 复制代码
  // 使用索引器
  Console.WriteLine(keyValuePairs["Name"]);
  //修改键为Name的数据值
  keyValuePairs["Name"] = 888;

ContainsKey(); 判断字典中是否包含某个 键

ContainsValue(); 判断字典中是否包含某个 值

cs 复制代码
//判断字典中是否包含某个 键
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>> 可以用来表示一组具有多个属性的对象。

练习:

把数据存储到字典中.用户输入需要查询的省份,打印对应的市,如:

输入:河北省 显示 :石家庄市 唐山市

输入:山西省 显示 :太原市 大同市

输入:河南省 显示 :郑州市 南阳市

cs 复制代码
//创建一个空字典
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);
cs 复制代码
//拿到字典中所有的键 遍历字典 拿到字典中的所有的数据 { "xxxx" : xxxx}
foreach (KeyValuePair<string, List<string>> item in dic)
{
    //item 是键和值一起存在的
    // 可以获取到 字典中当前数据的键
    Console.WriteLine(item.Key);
    // 可以获取到 字典中值列表当前数据的数据
    foreach (string n in item.Value) { Console.WriteLine(n); }
}
cs 复制代码
 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("输入省份字典中不存在");
 }
相关推荐
0xSec笔记本挖呀瓦呀挖3 小时前
电子取证之windows知识点:从 0 到 1 掌握 Windows 事件日志取证:以 玄机靶场-第五章 Windows 实战-evtx 文件分析
windows
星释6 小时前
鸿蒙Flutter三方库适配指南: 05.使用Windows搭建开发环境
windows·flutter·harmonyos
炒茄子16 小时前
Windows:解决电脑开机解锁后黑屏但鼠标可见可移动的问题
windows·计算机外设
luyun0202021 天前
流批了,pdf批量转excel
windows·pdf·excel·figma
vortex51 天前
在 Windows 系统中安装 Oracle、SQL Server(MSSQL)和 MySQL
windows·oracle·sqlserver
路由侠内网穿透1 天前
本地部署开源物联网平台 ThingsBoard 并实现外部访问( Windows 版本)
运维·服务器·windows·物联网·开源
Mr.Lu ‍1 天前
Windows开发,制作开发软件安装程序(二)
windows
skywalk81631 天前
windows装wsl ubuntu24.04 ,里面装qemu ,然后装mac os (windows也可以直接qemu安装macos)(未实践)
windows·ubuntu·macos·qemu
电脑小白技术1 天前
u盘安装系统提示“windows无法安装到这个磁盘,选中的磁盘具有gpt分区表”解决方法
windows·gpt·windows无法安装到磁盘
爱隐身的官人2 天前
Windows配置解压版MySQL5(免安装)
windows·mysql