关于C#泛型列表List<T>的基本用法总结
《关于C#泛型列表List
在C#编程中,泛型集合是处理动态数据的重要工具,其中`List
一、List的核心特性
1. **类型安全**:泛型参数`T`确保列表仅能存储指定类型的数据,避免装箱/拆箱开销。
2. **动态扩容**:内部基于数组实现,当容量不足时自动按1.5倍扩容(可通过`TrimExcess()`优化)。
3. **丰富方法集**:提供增删改查、排序、搜索等20+个实用方法。
4. **线程不安全**:多线程环境下需配合锁机制或使用`ConcurrentBag
二、基础操作详解
1. 创建与初始化
// 空列表创建
List numbers = new List();
// 指定容量创建(避免多次扩容)
List names = new List(100);
// 集合初始化器(C# 3.0+)
List dates = new List {
new DateTime(2023,1,1),
DateTime.Now
};
2. 元素操作
添加元素
List people = new List();
people.Add(new Person("Alice", 25)); // 末尾添加
people.Insert(0, new Person("Bob", 30)); // 指定位置插入
删除元素
// 按值删除(首次匹配)
people.Remove(new Person("Alice", 25));
// 按索引删除
people.RemoveAt(0);
// 条件删除(C# 8.0+)
people.RemoveAll(p => p.Age > 60);
访问元素
// 索引访问(需检查范围)
if (people.Count > 0) {
Person first = people[0];
}
// 安全访问扩展方法
public static T SafeGet(this List list, int index, T defaultValue) {
return index >= 0 && index
3. 搜索与查询
// 存在性检查
bool hasAlice = people.Exists(p => p.Name == "Alice");
// 查找索引
int index = people.FindIndex(p => p.Age == 25);
// LINQ查询(需using System.Linq)
var seniors = from p in people
where p.Age >= 65
select p.Name;
4. 排序操作
自然排序
// 实现IComparable接口后
people.Sort(); // 调用默认比较器
// 使用Comparison委托
people.Sort((x, y) => x.Age.CompareTo(y.Age));
var ordered = people.OrderBy(p => p.Name)
.ThenByDescending(p => p.Age)
.ToList();
三、高级用法解析
1. 自定义比较器
public class AgeComparer : IComparer {
public int Compare(Person x, Person y) {
return x.Age.CompareTo(y.Age);
}
}
// 使用自定义比较器
people.Sort(new AgeComparer());
2. 批量操作
// 添加范围
string[] newNames = { "Charlie", "David" };
names.AddRange(newNames);
// 转换为数组
Person[] array = people.ToArray();
// 范围操作(C# 8.0+)
var slice = people.GetRange(1, 2); // 从索引1开始取2个元素
3. 结构体优化
对于值类型列表,使用结构体可减少内存分配:
public struct Point {
public int X, Y;
}
List points = new List(1000); // 连续内存存储
4. 性能优化技巧
1. 预分配容量:`new List
2. 避免频繁扩容:当知道大致元素数量时提前设置
3. 使用`Capacity`属性动态调整:
if (people.Count > people.Capacity * 0.9) {
people.Capacity = people.Count * 2;
}
四、常见问题解决方案
1. 线程安全问题
private readonly object _lock = new object();
public void SafeAdd(Person p) {
lock (_lock) {
people.Add(p);
}
}
2. 空引用处理
// 安全添加扩展方法
public static void SafeAddRange(this List list, IEnumerable collection) {
if (list == null) throw new ArgumentNullException(nameof(list));
if (collection != null) {
list.AddRange(collection);
}
}
3. 自定义集合操作
// 分页扩展方法
public static List Paginate(this List list, int page, int pageSize) {
return list.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList();
}
五、与其它集合的对比
特性 | List |
Array | LinkedList |
---|---|---|---|
访问速度 | O(1) | O(1) | O(n) |
插入/删除 | O(n) | O(n) | O(1) |
内存占用 | 中等 | 固定 | 高 |
选择建议:
• 需要随机访问且大小可变 → `List
• 频繁中间插入/删除 → `LinkedList
• 大小固定且性能敏感 → 数组
六、实战案例分析
案例1:数据过滤与转换
public class OrderProcessor {
public List FilterHighValue(List orders, decimal threshold) {
return orders.Where(o => o.Total > threshold)
.OrderBy(o => o.Date)
.ToList();
}
}
案例2:缓存实现
public class SimpleCache {
private readonly List> _cache = new List>();
public void Add(TKey key, TValue value) {
_cache.Add(new KeyValuePair(key, value));
}
public bool TryGetValue(TKey key, out TValue value) {
var item = _cache.FirstOrDefault(x => Equals(x.Key, key));
value = item.Key != null ? item.Value : default;
return item.Key != null;
}
}
七、最佳实践总结
1. **明确容量需求**:初始化时设置合理容量
2. **优先使用LINQ**:对于复杂查询使用LINQ to Objects
3. **避免过度封装**:简单操作直接使用List方法
4. **注意null处理**:对引用类型进行空值检查
5. **考虑不可变集合**:对于只读场景使用`ImmutableList
关键词:C#泛型列表、List
简介:本文全面总结了C#中List