《C# List使用方法》
在C#编程中,List
一、List基础
List
1.1 创建List对象
通过构造函数初始化List,可指定初始容量(可选):
// 创建空List
List numbers = new List();
// 创建带初始容量的List(避免频繁扩容)
List names = new List(10);
// 创建时初始化元素
List prices = new List { 19.99, 29.99, 39.99 };
1.2 添加元素
List提供多种添加元素的方法:
- Add():在末尾添加单个元素
- AddRange():添加另一个集合的所有元素
- Insert():在指定索引处插入元素
List fruits = new List();
fruits.Add("Apple"); // 添加单个元素
fruits.AddRange(new[] { "Banana", "Cherry" }); // 添加多个元素
fruits.Insert(1, "Mango"); // 在索引1处插入
1.3 访问元素
通过索引器或索引方法访问元素:
string firstFruit = fruits[0]; // 通过索引访问
int mangoIndex = fruits.IndexOf("Mango"); // 获取元素索引
bool contains = fruits.Contains("Banana"); // 检查是否存在
二、常用操作方法
2.1 删除元素
List提供多种删除方式:
- Remove():删除第一个匹配项
- RemoveAt():删除指定索引的元素
- RemoveRange():删除指定范围内的元素
- Clear():清空所有元素
fruits.Remove("Apple"); // 删除"Apple"
fruits.RemoveAt(0); // 删除索引0的元素
fruits.RemoveRange(1, 2); // 从索引1开始删除2个元素
fruits.Clear(); // 清空列表
2.2 修改元素
直接通过索引修改元素值:
fruits[0] = "Pineapple"; // 修改索引0的元素
2.3 查找元素
使用LINQ或内置方法进行查找:
// 使用IndexOf查找(返回索引或-1)
int index = fruits.IndexOf("Banana");
// 使用Find方法(需委托)
string longFruit = fruits.Find(f => f.Length > 5);
// 使用LINQ查询
var expensiveFruits = fruits.Where(f => f.StartsWith("M"));
三、排序与转换
3.1 排序方法
List提供Sort()方法进行排序,支持默认排序和自定义比较:
List numbers = new List { 5, 2, 8, 1 };
// 默认升序排序
numbers.Sort();
// 降序排序(需先反转)
numbers.Sort();
numbers.Reverse();
// 自定义比较器
List people = new List
{
new Person { Name = "Alice", Age = 25 },
new Person { Name = "Bob", Age = 20 }
};
people.Sort((x, y) => x.Age.CompareTo(y.Age)); // 按Age升序
3.2 转换为其他集合
List可轻松转换为数组、HashSet等:
// 转换为数组
string[] fruitArray = fruits.ToArray();
// 转换为HashSet(去重)
HashSet uniqueFruits = new HashSet(fruits);
// 使用LINQ转换
var upperFruits = fruits.Select(f => f.ToUpper());
四、高级应用
4.1 使用泛型约束
创建自定义泛型List方法时,可通过where子句添加约束:
public List FilterList(List list, Func predicate) where T : class
{
return list.Where(predicate).ToList();
}
4.2 多线程环境下的使用
在多线程场景中,需注意List不是线程安全的。可通过以下方式处理:
- 使用lock语句同步访问
- 使用ConcurrentBag
等并发集合
private readonly object _lockObj = new object();
private List _sharedList = new List();
public void AddItem(int item)
{
lock (_lockObj)
{
_sharedList.Add(item);
}
}
4.3 性能优化技巧
- 预先设置Capacity避免频繁扩容
- 批量操作时优先使用AddRange而非多次Add
- 对大型列表排序时考虑使用更高效的算法
五、实际案例分析
案例1:学生成绩管理
public class Student
{
public string Name { get; set; }
public double Score { get; set; }
}
List students = new List
{
new Student { Name = "Alice", Score = 85 },
new Student { Name = "Bob", Score = 72 }
};
// 添加新学生
students.Add(new Student { Name = "Charlie", Score = 90 });
// 按分数排序
students.Sort((x, y) => y.Score.CompareTo(x.Score));
// 输出前3名
var top3 = students.Take(3);
foreach (var s in top3)
{
Console.WriteLine($"{s.Name}: {s.Score}");
}
案例2:数据处理管道
List rawData = new List { "10", "20", "abc", "30" };
// 过滤非数字项
var numericData = rawData
.Where(d => int.TryParse(d, out _))
.Select(int.Parse)
.ToList();
// 计算平均值
double average = numericData.Average();
Console.WriteLine($"Average: {average}");
六、常见问题解答
Q1: List与数组的主要区别是什么?
A: List是动态集合,可自动扩容;数组长度固定。List提供更多内置方法如Add、Remove等。
Q2: 如何高效合并两个List?
A: 使用AddRange方法:
List list1 = new List { 1, 2 };
List list2 = new List { 3, 4 };
list1.AddRange(list2);
Q3: List的默认容量是多少?
A: 默认容量为4,当元素数量超过容量时,List会自动扩容(通常翻倍)。
Q4: 如何实现List的去重?
A: 方法1:转换为HashSet再转回List
方法2:使用LINQ的Distinct()方法
List duplicates = new List { 1, 2, 2, 3 };
List unique = duplicates.Distinct().ToList();
七、最佳实践总结
- 合理设置初始Capacity以减少扩容开销
- 优先使用泛型方法保证类型安全
- 对大型列表操作考虑性能影响
- 多线程环境下使用同步机制
- 结合LINQ简化复杂操作
关键词:C#、List
简介:本文全面介绍了C#中List