网站首页 > 技术教程 正文
Dictionary<TKey, TValue> 和 List<T>是 C# 中两种非常常用的集合类型,它们都提供了存储集合的功能,但是它们在设计目的、用法和性能方面有显著的区别。
Dictionary<TKey, TValue>用于存储键值对,其中每个键都是唯一的,并且每个键都有一个对应的值。它适用于快速查找、插入和删除特定键的值。需要指定键的类型和值的类型,可以通过键来访问、添加、更新或删除值。通常提供了常数时间复杂度的查找、插入和删除操作,但这是在哈希表被充分散列的情况下。如果键的哈希码冲突频繁,性能可能会下降。默认不支持自动扩展,但你可以通过 Capacity属性来预先分配内存。
List<T>是一个顺序集合,用于存储一系列的元素。它提供了对元素的快速随机访问,并支持元素的添加、删除和更新。使用时只需要指定集合中元素的类型。你可以通过索引来访问、添加、更新或删除元素。List<T>的性能取决于集合的大小。对于小规模的数据,插入、删除和访问操作通常接近常数时间复杂度,但是随着集合大小的增长,这些操作的时间复杂度可能会变成线性,尤其是在大量元素添加和删除时。List<T>是动态的,可以自动扩展以容纳新元素。
在查找数据方面,Dictionary<TKey, TValue>通常更快,因为它是基于键的哈希表实现的,而 List<T>`需要遍历列表直到找到相应的索引。List<T>在末尾插入和删除数据时,通常很快,但如果需要在中间插入或删除,可能需要移动多个元素,这会导致速度变慢。Dictionary<TKey, TValue> 在理想情况下插入和删除操作也是很快的,但如果键的哈希码冲突严重,性能可能会下降。在内存占用方面,Dictionary<TKey, TValue> 由于内部实现包含哈希表和字典树等结构,可能会比 List<T>占用更多的内存。
在选择使用Dictionary<TKey, TValue>还是List<T> 时,应该根据特定需求来决定。如果需要通过键快速查找和访问值,那么 选择Dictionary<TKey, TValue>更好,如果需要按照顺序存储和访问元素,或者需要频繁地添加、删除元素,那么 List<T>更适合。
在C#中,对Dictionary<TKey, TValue> 和 List<T> 进行简单的效率测试,涉及到创建这两种类型的实例,然后执行一系列操作,如添加、查找、删除等,并测量所需的时间,这里提供一个简单的效率测试代码示例,其中,使用了 Stopwatch 类来测量操作的时间。
测试代码如下:
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{ // 测试 Dictionary<TKey, TValue>
Dictionary<int, string> dict = new Dictionary<int, string>();
List<int> list = new List<int>();
// 添加操作
Stopwatch sw1 = Stopwatch.StartNew();
for (int i = 0; i < 1000000; i++)
{
dict[i] = "Value";
}
sw1.Stop();
Console.WriteLine(#34;Dictionary Add: {sw1.ElapsedMilliseconds} ms");
// 查找操作
sw1.Restart();
for (int i = 0; i < 1000000; i++)
{
dict.TryGetValue(i, out _);
}
sw1.Stop();
Console.WriteLine(#34;Dictionary TryGetValue: {sw1.ElapsedMilliseconds} ms");
// 删除操作
sw1.Restart();
for (int i = 999999; i >= 0; i--)
{
dict.Remove(i);
}
sw1.Stop();
Console.WriteLine(#34;Dictionary Remove: {sw1.ElapsedMilliseconds} ms");
// 测试 List<T>
sw1.Restart();
for (int i = 0; i < 10000000; i++)
{
list.Add(i);
}
sw1.Stop();
Console.WriteLine(#34;List<int> Add: {sw1.ElapsedMilliseconds} ms");
//插入操作
sw1.Restart();
list.Insert(0, 1000000);
sw1.Stop();
Console.WriteLine(#34;List<int> Insert: {sw1.ElapsedMilliseconds} ms");
// 查找操作(通过索引)
sw1.Restart();
for (int i = 0; i < 1000000; i++)
{
var r = list[i];
}
sw1.Stop();
Console.WriteLine(#34;List<int> Access by Index: {sw1.ElapsedMilliseconds} ms");
// 删除操作(通过索引)
sw1.Restart();
for (int i = 0; i >= 999999; i++)
{
list.RemoveAt(i);
}
sw1.Stop();
Console.WriteLine(#34;List<int> RemoveAt: {sw1.ElapsedMilliseconds} ms");
Console.ReadLine();
}
}
}
运行结果如下:
从上面测试结果中可以明显看出,List<T>的性能受长度影响明显,而Dictionary<TKey, TValue>影响不大,在读写末尾数据数据时,两者性能接近,但是在中间插入数据时,List<T>的性能下降明显。当然,这个测试只是一个基本的示例,实际的应用场景可能会更复杂,并且性能也会受到许多因素的影响,如系统的负载、磁盘I/O速度、内存管理等。
综上所述,根据不同的应用场景,选择合适的数据集合,可以有效提高软件的运行效率。
- 上一篇: C#语法学习——静态类与非静态类
- 下一篇: CSharp学习笔记(15)
猜你喜欢
- 2024-11-19 C# 文字识别(OCR)
- 2024-11-19 c#手机开发Maui实现条形码扫描
- 2024-11-19 CSharp学习笔记(7)
- 2024-11-19 CSharp学习笔记(10)
- 2024-11-19 37岁辞职自学C#上位机开发通信类库第2天:进度记录
- 2024-11-19 CSharp学习笔记(16)
- 2024-11-19 python调用CSharp动态库
- 2024-11-19 C# 读取CSV文件
- 2024-11-19 CSharp学习笔记(14)
- 2024-11-19 C#委托—马工教你轻松玩转委托
你 发表评论:
欢迎- 最近发表
-
- 阿里P8大佬总结的Nacos入门笔记,从安装到进阶小白也能轻松学会
- Linux环境下,Jmeter压力测试的搭建及报错解决方法
- Java 在Word中合并单元格时删除重复值
- 解压缩软件哪个好用?4款大多数人常用的软件~
- Hadoop高可用集群搭建及API调用(hadoop3高可用)
- lombok注解@Data没有toString和getter、setter问题
- Apache Felix介绍(apache fineract)
- Spring Boot官方推荐的Docker镜像编译方式-分层jar包
- Gradle 使用手册(gradle详细教程)
- 字节二面:为什么SpringBoot的 jar可以直接运行?
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)