# C# (.NET) 中 List
在 C++ 中,vector 是动态数组的核心容器,提供了高效的元素存储和操作能力。而在 C# (.NET) 环境中,System.Collections.Generic.List
List
List
// 创建空列表
List numbers = new List();
// 指定初始容量(避免多次扩容)
List names = new List(100);
// 通过集合初始化器
List points = new List
{
new Point(1, 2),
new Point(3, 4)
};
// 从现有集合转换
int[] array = { 1, 2, 3 };
List listFromArray = new List(array);
### 1.2 核心属性解析
List
- Count:实际元素数量(只读)
- Capacity:底层数组容量(可读写)
List values = new List();
values.Capacity = 50; // 预分配空间
Console.WriteLine($"Count: {values.Count}, Capacity: {values.Capacity}");
## 二、元素操作方法
### 2.1 添加元素
List
List letters = new List();
// 尾部添加(O(1) 平均时间复杂度)
letters.Add('a');
// 指定位置插入(O(n) 时间复杂度)
letters.Insert(0, 'b'); // 在开头插入
// 批量添加
string[] words = { "hello", "world" };
letters.AddRange(words.Select(w => w[0]));
### 2.2 访问元素
通过索引器或 LINQ 方法实现元素访问:
List dates = new List
{
new DateTime(2023, 1, 1),
new DateTime(2023, 2, 1)
};
// 索引访问(O(1))
DateTime firstDate = dates[0];
// 安全访问(避免索引越界)
if (dates.Count > 1)
{
DateTime secondDate = dates[1];
}
// LINQ 查询
var futureDates = dates.Where(d => d > DateTime.Now);
### 2.3 删除元素
删除操作包含多种实现方式,性能特性各异:
List files = new List { "a.txt", "b.txt", "c.txt" };
// 按索引删除(O(n) 移动元素)
files.RemoveAt(0);
// 按值删除(首次匹配)
files.Remove("b.txt");
// 批量删除(条件删除)
files.RemoveAll(f => f.EndsWith(".tmp"));
// 清空集合
files.Clear();
## 三、高级功能实现
### 3.1 排序与搜索
List
List scores = new List { 85, 92, 78, 90 };
// 默认升序排序
scores.Sort();
// 自定义比较器
scores.Sort((x, y) => y.CompareTo(x)); // 降序
// 二分搜索(要求已排序)
int index = scores.BinarySearch(90);
// LINQ 排序(延迟执行)
var orderedScores = scores.OrderByDescending(s => s);
### 3.2 集合转换
List
List people = new List
{
new Person("Alice", 25),
new Person("Bob", 30)
};
// 转换为数组
Person[] array = people.ToArray();
// 转换为字典
Dictionary nameAgeDict = people
.ToDictionary(p => p.Name, p => p.Age);
// 转换为只读集合
IReadOnlyList readOnly = people.AsReadOnly();
### 3.3 线程安全处理
在多线程环境下使用 List
// 非线程安全示例(可能导致异常)
List sharedList = new List();
Parallel.For(0, 100, i =>
{
// 错误!多线程同时修改会抛出异常
sharedList.Add(i);
});
// 正确做法1:使用锁
object lockObj = new object();
Parallel.For(0, 100, i =>
{
lock (lockObj)
{
sharedList.Add(i);
}
});
// 正确做法2:使用并发集合
ConcurrentBag concurrentBag = new ConcurrentBag();
Parallel.For(0, 100, concurrentBag.Add);
## 四、性能优化策略
### 4.1 容量预分配
合理设置初始容量可显著减少扩容次数:
// 不推荐:频繁扩容
List smallBuffer = new List();
for (int i = 0; i optimizedBuffer = new List(10000);
for (int i = 0; i
### 4.2 批量操作优化
使用 AddRange 替代多次 Add 调用:
// 低效方式
List paths = new List();
paths.Add("C:\\file1.txt");
paths.Add("C:\\file2.txt");
// 高效方式
string[] newPaths = { "D:\\doc1.txt", "D:\\doc2.txt" };
paths.AddRange(newPaths);
### 4.3 避免不必要的操作
识别并消除性能瓶颈:
List products = GetProducts();
// 低效:每次循环都调用 Count
for (int i = 0; i
## 五、与 C++ vector 的对比分析
### 5.1 内存管理差异
C++ vector 直接管理内存,而 C# List
特性 | C++ vector | C# List |
---|---|---|
内存分配 | 手动/显式 | 自动/GC 管理 |
扩容策略 | 通常 2x 增长 | 默认 2x,可自定义 |
释放时机 | 显式调用析构 | GC 自动回收 |
关键操作的性能基准测试结果(百万级元素):
| 操作 | C++ vector (ms) | C# Listpublic class DataProcessor
{
private List _buffer = new List(1000);
public void ProcessBatch(IEnumerable newData)
{
// 批量添加
_buffer.AddRange(newData);
// 过滤无效数据
_buffer.RemoveAll(p => p.Timestamp x.Value.CompareTo(y.Value));
// 触发处理事件
OnDataProcessed?.Invoke(_buffer.Take(100).ToList());
}
public event Action> OnDataProcessed;
}
### 6.2 游戏对象管理
public class GameWorld
{
private List _activeObjects = new List(500);
private List _inactiveObjects = new List();
public void Update(float deltaTime)
{
// 激活对象
foreach (var obj in _inactiveObjects)
{
if (obj.ShouldActivate())
{
_activeObjects.Add(obj);
_inactiveObjects.Remove(obj);
break;
}
}
// 更新活动对象
for (int i = _activeObjects.Count - 1; i >= 0; i--)
{
_activeObjects[i].Update(deltaTime);
if (_activeObjects[i].IsDestroyed)
{
_inactiveObjects.Add(_activeObjects[i]);
_activeObjects.RemoveAt(i);
}
}
}
}
## 七、常见问题解答
### 7.1 何时使用 List当需要以下特性时优先选择 List
- 动态大小调整
- 频繁的插入/删除操作
- 内置方法支持(Sort、Find 等)
- 类型安全的泛型实现
选择依据:
场景 | List |
LinkedList |
---|---|---|
随机访问 | ✔ 高效 | ❌ 低效 |
头部插入 | ❌ O(n) | ✔ O(1) |
内存占用 | ✔ 紧凑 | ❌ 每个节点额外开销 |
List employees = GetEmployees();
// 方法1:实现 IComparer
public class ByAgeComparer : IComparer
{
public int Compare(Employee x, Employee y)
{
return x.Age.CompareTo(y.Age);
}
}
employees.Sort(new ByAgeComparer());
// 方法2:使用 Lambda 表达式
employees.Sort((x, y) => x.Department.CompareTo(y.Department));
关键词:C# List
简介:本文全面解析了 C# (.NET) 中 List