跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

C#中List入门指南_C#动态数组集合教程【基础】

List是泛型类,编译期需明确类型以确保类型安全、避免装箱拆箱;不指定类型会编译失败,.NET无非泛型List。 声明和初始化 List 时为什么必须指定类型 因为
List
是泛型类,编译器需要在编译期就知道元素类型,才能做类型检查、避免装箱拆箱、保证内存布局安全。不写类型(比如只写
List
)会编译失败,.NET 不提供非泛型的
List
类型(旧版
ArrayList
已淘汰)。 常见错误现象:
The non-generic type 'List' cannot be used with type arguments
正确写法:
List names = new List();
带初始值的写法:
List nums = new List { 1, 2, 3 };
预设容量(适合已知大致规模):
List buffer = new List(4096);
—— 避免多次扩容带来的内存复制开销 Add 与 AddRange 的实际性能差异在哪
Add
每次只加一个元素,内部可能触发一次扩容判断;
AddRange
接收整个
IEnumerable
(如数组、另一个
List
),它会先计算总长度,一次性扩容到位,再批量拷贝 —— 这比循环调用
Add
快得多,尤其对大量数据。 使用场景:从数据库查出 500 条记录要塞进新列表,别用
foreach
+
Add
,直接
list.AddRange(dbResults)
。 错误示范:
foreach (var x in source) list.Add(x);
推荐写法:
list.AddRange(source);
注意:
source
为空或 null 时,
AddRange
会抛
ArgumentNullException
,需提前判空 Remove 和 RemoveAt 容易混淆的语义区别
Remove
是“按值删第一个匹配项”,返回
bool
表示是否删成功;
RemoveAt
是“按索引删固定位置”,越界直接抛
ArgumentOutOfRangeException
—— 二者完全不等价,不能互相替换。 C知道 CSDN推出的一款AI技术问答工具 下载 常见错误现象:
list.Remove(0)
想删索引为 0 的元素,结果删掉了值为 0 的第一个元素(如果列表里根本没有 0,就什么也不做)。 删第 0 个位置 → 用
list.RemoveAt(0)
删值为 100 的元素 → 用
list.Remove(100)
删所有值为 100 的元素 → 用
list.RemoveAll(x => x == 100)
,不是反复调用
Remove
遍历时修改列表引发的 InvalidOperationException 用
foreach
遍历
List
时,如果在循环体内调用
Add
、
Remove
、
Clear
等改变结构的方法,运行时会立即抛
InvalidOperationException: Collection was modified
—— 这是 .NET 的安全保护机制,防止迭代器失效后继续读脏数据。 解决办法不是加锁或 try-catch,而是换策略: 要边查边删 → 改用
for
倒序遍历:
for (int i = list.Count - 1; i >= 0; i--) if (needRemove(list[i])) list.RemoveAt(i);
要收集待删项 → 先用
Where
或
FindAll
提取,再统一
RemoveAll
只是读取+少量修改 → 用
for
正序配
list[i] = newValue
(索引器赋值不触发结构变更) 这个异常不会在编译时报错,只有运行到那一步才崩,容易漏测 —— 尤其在逻辑分支多、条件嵌套深的代码里,得特别留神。

相关文章