一、C# 集合体系概览C# 的集合类型主要分布在两个核心命名空间System.Collections非泛型集合适用于.NET 早期版本代表类型有ArrayList、Hashtable、Queue等System.Collections.Generic泛型集合.NET 2.0类型安全且性能更优代表类型有ListT、DictionaryTKey, TValue、HashSetT等。其中ArrayList和ListT作为动态数组的典型实现是日常开发中最常用的集合类型也是理解 C# 集合设计思想的关键。二、ArrayList非泛型动态数组2.1 ArrayList 核心特性ArrayList是 C# 早期的动态数组实现本质是封装了object[]数组的类核心特性如下动态扩容底层基于数组实现初始容量为 0添加第一个元素时扩容至 4后续自动按需扩容非类型安全所有元素均以object类型存储值类型会发生装箱 / 拆箱操作灵活存储允许存储null值、重复元素支持任意类型的对象索引访问支持数组式的索引器访问时间复杂度 O (1)。2.2 ArrayList 常用操作1. 初始化ArrayList提供三种初始化方式适配不同场景// 空列表初始容量0 ArrayList list1 new ArrayList(); // 指定初始容量减少扩容次数提升性能 ArrayList list2 new ArrayList(100); // 从其他集合初始化 ArrayList list3 new ArrayList(new int[] { 1, 2, 3 });2. 元素增删ArrayList提供丰富的元素操作方法覆盖单个 / 批量、尾部 / 指定位置的增删需求ArrayList list new ArrayList(); // 1. 添加元素 list.Add(C#); // 尾部添加单个元素 list.Add(123); // 值类型自动装箱int → object list.AddRange(new object[] { 4.5, DateTime.Now }); // 批量添加 list.Insert(1, 插入到索引1的位置); // 指定索引插入 list.InsertRange(2, new ArrayList { a, b }); // 批量插入 // 2. 删除元素 list.Remove(C#); // 按值删除第一个匹配项 list.RemoveAt(0); // 按索引删除 list.RemoveRange(1, 2); // 从索引1开始删除2个元素 list.Clear(); // 清空所有元素3. 元素查找与访问ArrayList list new ArrayList { A, B, C, B }; // 检查元素是否存在 bool hasB list.Contains(B); // true // 查找元素索引 int firstBIndex list.IndexOf(B); // 1 int lastBIndex list.LastIndexOf(B); // 3 // 索引器访问需显式类型转换 string item (string)list[0]; // A // 排序后二分查找需先Sort list.Sort(); int cIndex list.BinarySearch(C); // 22.3 ArrayList 的局限性尽管ArrayList灵活但存在明显短板性能损耗值类型的装箱 / 拆箱操作增加内存开销和性能消耗类型不安全编译时无法校验元素类型运行时可能抛出InvalidCastException现代开发不推荐仅适用于遗留代码或.NET 1.x 环境新代码优先使用泛型集合。三、ListT类型安全的泛型动态数组ListT是ArrayList的泛型替代版本解决了非泛型集合的类型安全和性能问题是当前 C# 开发的首选动态数组。3.1 ListT核心优势与ArrayList相比ListT的核心改进在于特性ArrayListListT类型安全非泛型object 存储泛型编译时类型校验性能装箱 / 拆箱损耗无装箱操作性能更优内存占用较高object 引用更低直接存储值类型错误排查运行时类型转换异常编译时类型错误提示3.2 ListT常用操作1. 初始化与基础操作// 空列表 Listint numbers new Listint(); // 初始化赋值 Liststring names new Liststring { Alice, Bob }; // 指定初始容量 Listdouble values new Listdouble(10); // 添加元素 numbers.Add(1); numbers.AddRange(new int[] { 2, 3, 4 }); // 访问与修改 int first numbers[0]; // 无需拆箱 numbers[1] 10; // 基础查询 int count numbers.Count; bool has3 numbers.Contains(3);2. 高级操作排序ListT的Sort方法支持多种排序方式满足复杂场景需求方式 1默认排序实现 IComparableT自定义类型需实现IComparableT接口重写CompareTo方法public class Student : IComparableStudent { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } // 按Id升序排序 public int CompareTo(Student other) { if (this.Id other.Id) return 1; if (this.Id other.Id) return -1; return 0; } } // 排序使用 ListStudent students new ListStudent { new Student { Id 1, Name 张三 }, new Student { Id 3, Name 李四 }, new Student { Id 2, Name 王五 } }; students.Sort(); // 按Id升序排列方式 2自定义比较器IComparerT适用于多种排序规则的场景无需修改实体类// 按年龄降序的比较器 public class StudentAgeComparer : IComparerStudent { public int Compare(Student x, Student y) { return y.Age.CompareTo(x.Age); } } // 使用比较器排序 students.Sort(new StudentAgeComparer());方式 3Lambda 表达式ComparisonT适用于临时排序需求简化代码// 按年龄降序排序 students.Sort((x, y) y.Age.CompareTo(x.Age));3. 高级操作查找与转换Listint numbers new Listint { 1, 2, 3, 4, 5 }; // 查找第一个偶数 int firstEven numbers.Find(n n % 2 0); // 查找所有偶数 Listint allEvens numbers.FindAll(n n % 2 0); // 转换为字符串列表 Liststring strNumbers numbers.ConvertAll(n n.ToString()); // 转换为数组 int[] numArray numbers.ToArray();四、ArrayList 与 ListT核心对比表格维度ArrayListListT类型系统非泛型object泛型强类型性能装箱 / 拆箱损耗无装箱性能更高类型安全运行时可能出错编译时类型校验内存占用较高更低适用场景遗留代码、混合类型存储现代开发、类型明确的集合引入版本.NET 1.0.NET 2.0五、最佳实践优先使用 ListT新开发项目中无论值类型还是引用类型均推荐使用ListT兼顾性能与类型安全避免 ArrayList仅在维护.NET 1.x 遗留代码或必须存储混合类型时使用ArrayList指定初始容量当已知集合大致大小初始化时指定容量如new Listint(100)减少自动扩容的性能损耗排序优化自定义类型排序优先使用IComparerT或ComparisonT避免修改实体类的IComparableT实现减少装箱操作若需存储混合类型可使用Listobject替代ArrayList保持泛型特性。总结ArrayList作为 C# 早期的动态数组实现见证了.NET 集合体系的发展而ListT作为泛型时代的产物凭借类型安全、高性能的优势成为现代 C# 开发的首选。理解两者的设计思想与使用差异不仅能帮助开发者写出更高效的代码也能深入掌握 C# 类型系统的核心逻辑。在实际开发中结合场景选择合适的集合类型才能充分发挥 C# 的语言特性与性能优势。