C#中的List集合是System.Collections.Generic命名空间下的泛型集合类型,它允许我们存储同一指定类型的元素,并且支持动态扩容,不需要像数组一样提前固定长度,同时避免了ArrayList存储值类型时的装箱拆箱性能损耗,是日常开发中处理同类型数据集合的首选工具。

List集合的核心作用
List集合主要解决传统数据容器的痛点,核心作用可以归纳为以下几点:
- 动态存储同类型数据:不需要预先声明固定长度,元素数量可以随着业务需求动态增长,比数组更灵活。
- 类型安全:因为是泛型集合,声明时指定元素类型后,只能存储该类型的元素,编译阶段就能发现类型不匹配的错误,比ArrayList更安全。
- 丰富的内置操作:提供了添加、删除、查找、排序、反转等大量现成方法,不需要开发者自己实现这些基础逻辑,提升开发效率。
- 支持索引访问:和数组一样可以通过下标直接访问元素,兼顾了数组的访问便利性和集合的灵活性。
List集合的基本使用步骤
1. 引入命名空间与创建初始化
使用List集合前需要先引入泛型集合命名空间,然后声明并初始化集合,初始化时可以指定初始容量,也可以直接添加初始元素。
using System;
using System.Collections.Generic;
namespace ListDemo
{
class Program
{
static void Main(string[] args)
{
// 创建一个存储int类型的List,初始容量为5(可选,不指定则使用默认容量)
List<int> numList = new List<int>(5);
// 创建时直接初始化元素
List<string> nameList = new List<string>() { "张三", "李四", "王五" };
}
}
}
2. 添加元素
List提供了多种添加元素的方法,既可以添加单个元素,也可以添加另一个集合的所有元素,还能在指定索引位置插入元素。
using System;
using System.Collections.Generic;
namespace ListDemo
{
class Program
{
static void Main(string[] args)
{
List<int> numList = new List<int>();
// 添加单个元素
numList.Add(10);
numList.Add(20);
numList.Add(30);
// 添加另一个集合的所有元素
List<int> extraList = new List<int>() { 40, 50 };
numList.AddRange(extraList);
// 在索引1的位置插入元素15
numList.Insert(1, 15);
// 输出当前所有元素
foreach (var num in numList)
{
Console.WriteLine(num);
}
// 输出结果:10 15 20 30 40 50
}
}
}
3. 删除元素
删除元素可以根据元素值删除,也可以根据索引删除,还可以删除满足条件的所有元素,或者清空整个集合。
using System;
using System.Collections.Generic;
namespace ListDemo
{
class Program
{
static void Main(string[] args)
{
List<int> numList = new List<int>() { 10, 20, 30, 20, 40 };
// 根据元素值删除第一个匹配的项
numList.Remove(20); // 删除第一个20,集合变为10,30,20,40
// 根据索引删除元素
numList.RemoveAt(1); // 删除索引1的元素30,集合变为10,20,40
// 删除满足条件的所有元素,这里删除所有大于15的元素
numList.RemoveAll(x => x > 15); // 集合变为10
// 清空集合
numList.Clear();
}
}
}
4. 遍历与查询元素
List支持多种遍历方式,也可以通过内置方法查询元素是否存在、获取元素索引等。
using System;
using System.Collections.Generic;
namespace ListDemo
{
class Program
{
static void Main(string[] args)
{
List<string> nameList = new List<string>() { "张三", "李四", "王五", "赵六" };
// 方式1:for循环遍历,支持通过索引访问
for (int i = 0; i < nameList.Count; i++)
{
Console.WriteLine($"索引{i}的元素是:{nameList[i]}");
}
// 方式2:foreach遍历
foreach (string name in nameList)
{
Console.WriteLine(name);
}
// 查询元素是否存在
bool hasLiSi = nameList.Contains("李四"); // 返回true
// 查找元素的索引,找不到返回-1
int index = nameList.IndexOf("王五"); // 返回2
// 查找满足条件的第一个元素
string firstLongName = nameList.Find(x => x.Length > 2); // 返回"张三"
}
}
}
5. 常用其他方法
List还提供了排序、反转、复制等常用方法,满足更多业务场景需求。
using System;
using System.Collections.Generic;
namespace ListDemo
{
class Program
{
static void Main(string[] args)
{
List<int> numList = new List<int>() { 30, 10, 50, 20, 40 };
// 升序排序
numList.Sort(); // 集合变为10,20,30,40,50
// 反转集合顺序
numList.Reverse(); // 集合变为50,40,30,20,10
// 复制集合到数组
int[] numArray = numList.ToArray();
// 判断集合是否为空
bool isEmpty = numList.Count == 0;
}
}
}
使用List集合的注意事项
在使用List集合时需要注意几个常见问题:
- 避免在遍历过程中直接修改集合元素数量,比如遍历时调用
Remove方法,会导致遍历异常,需要修改的话可以先用临时集合存储要删除的元素,遍历结束后再统一删除。 - 如果已知集合的大致元素数量,可以在创建时指定初始容量,减少扩容带来的性能损耗,因为List每次扩容都会新建一个更大的数组并复制原有元素。
- List的索引访问和数组一样是O(1)时间复杂度,但是插入和删除中间元素的时间复杂度是O(n),如果频繁在中间插入删除元素,可能需要考虑使用LinkedList集合。
List集合是C#中最基础也最常用的集合类型,熟练掌握它的使用方法,能大幅提升日常数据处理的开发效率,建议开发者多结合实际场景练习相关操作。