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

发布于:2025-07-30 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

列表(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

 //向字典中添加数据 Add
 keyValuePairs.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("输入省份字典中不存在");
 }

网站公告

今日签到

点亮在社区的每一天
去签到