介绍C# List<T>用法详解
《介绍C# List
在C#开发中,集合类型是处理数据存储与操作的核心工具。其中,泛型集合`List
一、List基础概念
`List
1.1 创建List实例
通过构造函数可创建空列表或指定初始容量:
// 创建空列表
List names = new List();
// 创建包含初始元素的列表
List numbers = new List { 1, 2, 3 };
// 指定初始容量(避免频繁扩容)
List values = new List(100);
1.2 容量管理机制
`List
List chars = new List();
chars.Add('a');
chars.Add('b');
Console.WriteLine($"Count: {chars.Count}"); // 输出2
Console.WriteLine($"Capacity: {chars.Capacity}"); // 输出4(默认初始容量)
二、核心操作方法
`List
2.1 添加元素
使用`Add()`在末尾添加单个元素,`AddRange()`添加集合:
List fruits = new List();
fruits.Add("Apple");
fruits.AddRange(new[] { "Banana", "Orange" });
2.2 插入元素
`Insert(index, item)`在指定位置插入元素:
List digits = new List { 1, 3, 4 };
digits.Insert(1, 2); // 结果为[1,2,3,4]
2.3 删除元素
提供多种删除方式:
List colors = new List { "Red", "Green", "Blue" };
// 按索引删除
colors.RemoveAt(0); // 删除"Red"
// 按值删除(首次匹配)
colors.Remove("Green");
// 删除所有匹配项
colors.RemoveAll(c => c.StartsWith("B")); // 删除"Blue"
2.4 查找元素
常用查找方法:
List people = new List
{
new Person { Name = "Alice", Age = 25 },
new Person { Name = "Bob", Age = 30 }
};
// 查找索引(不存在返回-1)
int index = people.FindIndex(p => p.Age > 28); // 返回1
// 查找第一个匹配项(不存在返回default)
Person person = people.Find(p => p.Name == "Alice");
// 判断是否存在
bool exists = people.Exists(p => p.Age == 25);
2.5 排序操作
支持自然排序和自定义排序:
List numbers = new List { 5, 2, 8, 1 };
// 升序排序
numbers.Sort(); // [1,2,5,8]
// 降序排序
numbers.Sort((a, b) => b.CompareTo(a)); // [8,5,2,1]
// 自定义对象排序
List products = new List
{
new Product { Name = "Laptop", Price = 999 },
new Product { Name = "Phone", Price = 699 }
};
products.Sort((x, y) => x.Price.CompareTo(y.Price));
三、高级应用场景
3.1 批量操作优化
对于大数据量操作,`AddRange()`比多次`Add()`更高效:
// 低效方式
List slowList = new List();
for (int i = 0; i fastList = new List(10000);
var temp = new List();
for (int i = 0; i
3.2 自定义比较器
实现`IComparer
public class AgeComparer : IComparer
{
public int Compare(Person x, Person y)
{
return x.Age.CompareTo(y.Age);
}
}
// 使用自定义比较器
List people = ...;
people.Sort(new AgeComparer());
3.3 线程安全处理
多线程环境下需使用锁机制:
private readonly object _lock = new object();
private List _sharedList = new List();
public void AddSafely(int value)
{
lock (_lock)
{
_sharedList.Add(value);
}
}
3.4 转换为其他集合
`List
List cities = new List { "NY", "LA", "CHI" };
// 转为数组
string[] cityArray = cities.ToArray();
// 转为字典(需配合Select)
var cityDict = cities.Select((city, index) => new { Index = index, City = city })
.ToDictionary(x => x.Index, x => x.City);
四、性能优化建议
4.1 合理设置初始容量
预先知道元素数量时,指定初始容量可避免多次扩容:
// 假设需要存储1000个元素
List dataPoints = new List(1000);
4.2 使用结构体减少内存
对于小型值类型,使用结构体比类更节省内存:
public struct Point
{
public int X;
public int Y;
}
List points = new List();
4.3 避免频繁修改操作
在循环中频繁插入/删除会导致性能下降,可考虑:
- 先收集所有操作,最后统一执行
- 使用`LinkedList
`替代(当操作集中在头部/尾部时)
五、常见问题解决方案
5.1 索引越界异常
访问前应检查索引范围:
if (index >= 0 && index
5.2 空引用异常
使用`null`条件运算符或显式检查:
// 方法1:使用null条件运算符
var first = myList?.FirstOrDefault();
// 方法2:显式检查
if (myList != null && myList.Count > 0)
{
var first = myList[0];
}
5.3 性能对比:List vs Array
特性 | List |
Array |
---|---|---|
动态扩容 | 支持 | 不支持 |
类型安全 | 支持 | 支持(非泛型数组不支持) |
内存占用 | 稍高(存储容量信息) | 更低 |
访问速度 | O(1) | O(1) |
六、扩展方法实践
可为`List
public static class ListExtensions
{
public static void Shuffle(this List list)
{
Random rng = new Random();
int n = list.Count;
while (n > 1)
{
n--;
int k = rng.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}
}
// 使用
List cards = Enumerable.Range(1, 52).ToList();
cards.Shuffle();
关键词:C#、List
简介:本文全面解析C#中List