list默认capacity为0,首次add扩容至4;预估容量应直接指定以避免多次扩容;capacity≠count,clear不释放内存;insert非尾部性能差;foreach中不可remove,应用removeall或倒序for删除。

声明和初始化:别让 Capacity = 0 拖慢第一次 Add
新建 List<t></t> 时,默认构造函数 new List<string>()</string> 的 Capacity 是 0,**不是 16**(这是常见误解)。第一次 Add() 会触发内部数组扩容到容量 4,之后按需翻倍。如果预估要存几百个元素,直接指定初始容量能省下多次内存分配和复制开销:
List<string> logs = new List<string>(1024); // 避免前几次 Add 触发扩容
List<int> ids = new List<int> { 101, 102, 103 }; // 初始化器语法,简洁安全⚠️ 注意:Capacity ≠ Count —— 前者是内部数组大小,后者才是当前真实元素数;Clear() 只清空 Count,不重置 Capacity,内存没释放。
Add、Insert、AddRange:中间插入代价高,优先用尾部追加
Add() 是 O(1) 均摊操作(扩容时为 O(n)),而 Insert(int index, T item) 在非末尾位置插入是 O(n),因为后续所有元素都要往前挪一位。高频场景如日志缓冲、队列推送,应避免在索引 0 或中间反复 Insert()。
-
Add(item):追加到末尾,推荐用于大多数新增场景 -
Insert(0, item):等价于“头插”,性能差,考虑改用Stack<t></t>或反转逻辑 -
AddRange(collection):比循环调用Add()快得多 —— 内部一次校验容量 + 一次Array.Copy,尤其适合从数组、其他集合批量导入
示例错误写法(低效):
foreach (var s in sourceArray) {
list.Insert(0, s); // 每次都移动全部已有元素!
}遍历与删除:千万别在 foreach 里调 Remove
foreach 本质调用 GetEnumerator(),底层维护一个版本号(_version)。只要列表被修改(Add、Remove、Clear 等),版本号就变,迭代器立刻抛出 InvalidOperationException: "Collection was modified..."。
系统优势: 1、 使用全新ASP.Net+c#和三层结构开发. 2、 可生成各类静态页面(html,htm,shtm,shtml和.aspx) 3、 管理后台风格模板自由选择,界面精美 4、 风格模板每月更新多套,还可按需定制 5、 独具的缓存技术加快网页浏览速度 6、 智能销售统计,图表分析 7、 集成国内各大统计系统 8、 多国语言支持,内置简体繁体和英语 9、 UTF-8编码,可使用于全球
正确做法分三类:
- 删指定值 → 用
RemoveAll(predicate)(推荐):list.RemoveAll(x => x.StartsWith("Temp")); - 删指定索引范围 → 用
RemoveRange(index, count),先算好再删 - 需要边遍历边判断 → 改用
for倒序删(避免索引错位):for (int i = list.Count - 1; i >= 0; i--) if (needRemove(list[i])) list.RemoveAt(i);
性能敏感场景:装箱、LINQ.ToList() 和 TrimExcess 的取舍
值类型(如 int、DateTime)存进 List<t></t> **完全不装箱**——这是它碾压 ArrayList 的核心优势。但若误用非泛型接口(比如把 List<int></int> 强转成 IList 再传参),可能意外触发装箱。
常见陷阱:
-
someList.Select(x => x * 2).ToList():每次调用都新建 List 并复制,大数据量慎用;可复用已有 List +Clear()+AddRange() -
TrimExcess():把Capacity缩到等于Count,省内存但触发一次数组复制 —— 只在明确后续不再增长且内存紧张时调用 - 频繁
RemoveAt(0)或Insert(0, ...):说明数据结构选错,换成Queue<t></t>或LinkedList<t></t>更合适
真正影响性能的从来不是方法名有多长,而是你是否清楚每次调用背后在搬多少字节的内存。









