C# 在 System.Collections.Generic 中提供了丰富的集合类型来存储数据组。最常见的是 List<T>(动态数组)、Dictionary<K,V>(键值映射)和 HashSet<T>(唯一集合)。选择正确的集合类型对于代码的清晰性和性能都很重要。
var numbers = new List<int> { 1, 2, 3 };
numbers.Add(4); // grows dynamically
numbers[0]; // index access — O(1)
numbers.Contains(3); // O(n) search
numbers.Remove(2);
numbers.Count; // size
foreach (var n in numbers) { } // iterate
List<T> 是首选的通用集合 — 一个有序、可调整大小、可索引的列表。<T> 是一个泛型类型参数(List<string>、List<User>),提供了编译时类型安全。
var ages = new Dictionary<string, int> { ["Ann"] = 30, ["Bob"] = 25 };
ages["Carol"] = 28; // add/set
ages["Ann"]; // get by key — O(1)
ages.ContainsKey("Ann");
ages.TryGetValue("Ann", out var age); // safe lookup (no exception if missing)
foreach (var (name, a) in ages) { } // iterate key-value pairs
Dictionary<K,V> 将键映射到值,具有快速的 O(1) 查找 — 用于缓存、索引和任何基于键的访问。TryGetValue 是安全查找的方式(避免在键不存在时抛出异常)。
var set = new HashSet<int> { 1, 2, 3 }; // unique elements, O(1) Contains
set.Add(2); // ignored (duplicate)
var queue = new Queue<int>(); // FIFO
var stack = new Stack<int>(); // LIFO
int[] arr = { 1, 2, 3 }; // fixed-size array
var ro = numbers.AsReadOnly(); // read-only wrapper
Ordered, indexed, resizable → List<T>
Key-value lookup (fast) → Dictionary<K,V>
Uniqueness / fast membership → HashSet<T>
FIFO / LIFO processing → Queue<T> / Stack<T>
Fixed size / performance-critical → array (T[])
集合是几乎每个程序的基础 — 存储和处理数据组是经常性的任务 — 因此理解 C# 的常见集合类型并做出正确选择是必不可少的日常知识。
了解主要类型及其用途 — List<T> 用于有序、可索引、可调整大小的数据(通用工作马)、Dictionary<K,V> 用于快速的基于键的查找(缓存、索引)、HashSet<T> 用于唯一性和快速成员测试,以及 Queue/Stack 用于 FIFO/LIFO 处理 — 这对于编写高效、清晰的代码是必需的。
选择直接影响 性能(例如 Dictionary 的 O(1) 查找与扫描 List 的 O(n),或 HashSet 的 O(1) 成员测试与 List 的 O(n))和代码意图,因此选择合适的集合而不是默认对所有情况使用 List<T> 是一项重要技能。
这些集合也是 泛型(<T>),提供编译时类型安全。
了解实际细节,如 TryGetValue 用于安全的字典查找(避免键缺失时的异常)和每种类型的性能特征,涵盖了在 C# 中处理数据的日常需求。
由于集合几乎出现在每个程序中,且正确的选择会显著影响性能和可读性,掌握常见集合类型及其适当的用途是有效 C# 开发的基础性、必需知识。