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

c#泛型集合(ArrayList和List、Dictionary的对比)

一、List<T> 集合

1. 基本概念
  • 泛型集合:只能存储指定类型的数据,类型安全。

  • 动态扩容:无需指定初始大小,自动调整容量。

  • 性能优势:避免装箱拆箱(相比 ArrayList)。

2. 创建与初始化
// 空列表
List<int> list = new List<int>();
​
// 带初始值的列表
List<string> list4 = new List<string> { "aaa", "ccc", "bbb" };
3. 常用属性与方法
操作代码示例说明
添加元素list.Add(100);在末尾添加单个元素。
批量添加list.AddRange(new[] {1, 2, 3});添加集合中的所有元素。
插入元素list.Insert(1, "apple");在指定索引处插入元素。
访问元素string item = list[0];通过索引访问元素(索引从 0 开始)。
修改元素list[0] = "banana";通过索引修改元素值。
删除元素list.Remove("apple");删除第一个匹配的元素。
删除指定位置list.RemoveAt(0);删除指定索引的元素。
判断元素存在bool exists = list.Contains("apple");检查列表是否包含指定元素。
获取元素索引int index = list.IndexOf("apple");返回元素的第一个索引(不存在返回 -1)。
排序list.Sort();对列表进行升序排序(元素需实现 IComparable)。
反转顺序list.Reverse();反转列表元素的顺序。
清空列表list.Clear();移除所有元素。
获取元素数量int count = list.Count;返回列表中的元素个数。
4. 高阶函数(Lambda 表达式)
方法作用示例
Find()查找第一个符合条件的元素。int evenNum = list.Find(x => x % 2 == 0);
FindAll()查找所有符合条件的元素,返回新列表。List<int> evens = list.FindAll(x => x % 2 == 0);
FindIndex()查找第一个符合条件的元素的索引。int index = list.FindIndex(x => x > 10);
Any()判断是否存在符合条件的元素(返回 bool)。bool hasEven = list.Any(x => x % 2 == 0);
All()判断所有元素是否都符合条件。bool allPositive = list.All(x => x > 0);
Where()筛选符合条件的元素(返回 IEnumerable<T>)。var filtered = list.Where(x => x < 100);
ForEach()对每个元素执行操作。list.ForEach(x => Console.WriteLine(x));

二、Dictionary<TKey, TValue> 字典

1. 基本概念
  • 键值对集合:每个元素包含唯一的键(Key)和对应的值(Value)。

  • 快速查找:通过键快速定位值(时间复杂度 O (1))。

  • 键的唯一性:键不能重复,且必须实现 IEquatable<T> 接口。

2. 创建与初始化
// 空字典
Dictionary<string, int> dict = new Dictionary<string, int>();
​
// 带初始值的字典
Dictionary<string, int> asciiDict = new Dictionary<string, int> {{"a", 97},{"c", 99},{"b", 98}
};
3. 常用属性与方法
操作代码示例说明
添加键值对dict.Add("apple", 1);添加键值对(键不存在时)。
通过键访问值int value = dict["apple"];通过键获取值(键不存在时抛出异常)。
通过键设置值dict["apple"] = 100;修改已存在键对应的值。
安全获取值bool found = dict.TryGetValue("apple", out int value);尝试获取值,避免异常。
判断键是否存在bool hasKey = dict.ContainsKey("apple");检查字典是否包含指定键。
判断值是否存在bool hasValue = dict.ContainsValue(1);检查字典是否包含指定值。
删除键值对dict.Remove("apple");删除指定键对应的元素。
清空字典dict.Clear();移除所有键值对。
获取所有键var keys = dict.Keys;返回所有键的集合(类型:Dictionary<TKey, TValue>.KeyCollection)。
获取所有值var values = dict.Values;返回所有值的集合(类型:Dictionary<TKey, TValue>.ValueCollection)。
获取元素数量int count = dict.Count;返回字典中键值对的数量。
4. 遍历字典
// 遍历所有键值对
foreach (KeyValuePair<string, int> item in dict) {Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
}
​
// 简化写法(使用 var)
foreach (var item in dict) {Console.WriteLine($"Key: {item.Key}, Value: {item.Value}");
}
​
// 单独遍历键或值
foreach (string key in dict.Keys) {Console.WriteLine(key);
}
​
foreach (int value in dict.Values) {Console.WriteLine(value);
}

三、List<T> 与 ArrayList 的对比

特性List<T>ArrayList
类型安全是(泛型)否(可存储任意类型)
装箱拆箱有(值类型与 object 之间转换)
性能高(无需类型转换)低(频繁装箱拆箱)
语法需要指定类型 List<int>直接使用 ArrayList
推荐场景存储相同类型的数据需存储混合类型(不推荐)

四、代码补充建议

1. List<T> 补充
// 安全访问元素(避免索引越界)
if (index < list.Count) {Console.WriteLine(list[index]);
}
​
// 使用 List<T> 的构造函数初始化
List<int> numbers = new List<int>(new[] {1, 2, 3});
​
// 复杂对象的列表
List<Person> people = new List<Person> {new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 }
};
​
// 对复杂对象排序
people.Sort((p1, p2) => p1.Age.CompareTo(p2.Age));
2. Dictionary<TKey, TValue> 补充
// 安全添加键值对(避免键已存在的异常)
if (!dict.ContainsKey("apple")) {dict.Add("apple", 1);
}
​
// 或者使用 TryAdd(.NET Core 2.0+)
dict.TryAdd("apple", 1);
​
// 嵌套字典
Dictionary<string, Dictionary<string, int>> nestedDict = new Dictionary<string, Dictionary<string, int>>();
nestedDict["fruits"] = new Dictionary<string, int> { {"apple", 1}, {"banana", 2} };

五、注意事项

  1. 集合线程安全List<T>Dictionary<TKey, TValue> 是非线程安全的。多线程环境下使用需加锁或使用 ConcurrentDictionary<TKey, TValue>

  2. 键的唯一性:字典的键必须唯一,否则会抛出 ArgumentException

  3. 空引用检查:访问集合元素前建议检查 Count > 0 或使用 Any() 方法。

  4. 性能优化:若需频繁插入 / 删除元素,考虑使用 LinkedList<T>;若需线程安全,使用 ConcurrentBag<T> 等并发集合。

http://www.lryc.cn/news/593351.html

相关文章:

  • 每日面试题09:进程、线程、协程的区别
  • 48Days-Day03 | 删除公共字符,两个链表的第一个公共结点,mari和shiny
  • 【每日算法】专题十五_BFS 解决 FloodFill 算法
  • HD Video Converter Factory pro 高清视频转换器 v27.7.0 绿色中文便携版
  • 【2025最新】 .NET FrameWork微软离线运行库合集,一键安装版
  • Spring之【AnnotatedBeanDefinitionReader】
  • 前端面试专栏-工程化:28.团队协作与版本控制(Git)
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现动物分类(C#源码,UI界面版)
  • Selenium 中 findElement 方法全解析:定位网页元素的 7 种方式
  • RPC(Remote Procedure Call,远程过程调用)介绍
  • 探秘边缘安全架构设计要点解析
  • 深入了解 find_element 方法:Web 自动化定位元素的核心​
  • Node.js特训专栏-实战进阶:17.会话管理与安全存储
  • 开发框架安全ThinkPHPLaravelSpringBootStruts2SpringCloud复现
  • SLAM中的非线性优化-2D图优化之激光SLAM基于优化的前端匹配(十八)
  • KVM中使用桥接模式.运维就业技术教程
  • 零基础学习性能测试-linux服务器监控:CPU监控
  • 【RK3576】【Android14】USB开发调试
  • 《Spring Boot 插件化架构实战:从 SPI 到热插拔的三级跳》
  • Android14 SystemUI 启动流程(2)
  • Verilog *2* SPI-立创逻辑派G1测试-1
  • 软件警告弹窗与兼容性问题
  • 当OT遇见IT:Apache IoTDB如何用“时序空间一体化“破解工业物联网数据孤岛困局
  • FMEA-CP-PFD三位一体数字化闭环:汽车部件质量管控的速效引擎
  • XSS漏洞----基于Dom的xss
  • 动态规划算法的欢乐密码(三):简单多状态DP问题(上)
  • GA-BP遗传算法优化BP神经网络数据生成,采用SVM分类模型评估
  • RabbitMQ面试精讲 Day 3:Exchange类型与路由策略详解
  • PostgreSQL常用命令与工具指南
  • 发明专利怎么写,与学术文章异同点与注意事项