List集合 #

一、List概述 #

List是最常用的泛型集合,提供动态大小的有序列表。

1.1 特点 #

  • 动态大小
  • 支持索引访问
  • 类型安全
  • 实现IList接口

1.2 创建List #

csharp
var list1 = new List<int>();
var list2 = new List<int> { 1, 2, 3, 4, 5 };
var list3 = new List<int>(10);
var list4 = new List<int>(new[] { 1, 2, 3 });

二、添加元素 #

2.1 Add方法 #

csharp
var list = new List<string>();

list.Add("张三");
list.Add("李四");
list.Add("王五");

2.2 AddRange方法 #

csharp
var list = new List<int> { 1, 2, 3 };
var more = new[] { 4, 5, 6 };

list.AddRange(more);
list.AddRange(new[] { 7, 8, 9 });

2.3 Insert方法 #

csharp
var list = new List<string> { "李四", "王五" };

list.Insert(0, "张三");
list.Insert(2, "赵六");

2.4 InsertRange方法 #

csharp
var list = new List<int> { 1, 5 };
list.InsertRange(1, new[] { 2, 3, 4 });

三、访问元素 #

3.1 索引访问 #

csharp
var list = new List<string> { "张三", "李四", "王五" };

string first = list[0];
string last = list[^1];
string secondLast = list[^2];

3.2 遍历 #

csharp
var list = new List<int> { 1, 2, 3, 4, 5 };

for (int i = 0; i < list.Count; i++)
{
    Console.WriteLine(list[i]);
}

foreach (var item in list)
{
    Console.WriteLine(item);
}

3.3 切片(C# 8+) #

csharp
var list = new List<int> { 1, 2, 3, 4, 5 };

var firstThree = list[0..3];
var lastTwo = list[^2..];
var middle = list[1..4];

四、删除元素 #

4.1 Remove方法 #

csharp
var list = new List<string> { "张三", "李四", "王五" };

bool removed = list.Remove("李四");
bool notFound = list.Remove("赵六");

4.2 RemoveAt方法 #

csharp
var list = new List<string> { "张三", "李四", "王五" };

list.RemoveAt(0);
list.RemoveAt(list.Count - 1);

4.3 RemoveRange方法 #

csharp
var list = new List<int> { 1, 2, 3, 4, 5 };
list.RemoveRange(1, 2);

4.4 RemoveAll方法 #

csharp
var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int removed = list.RemoveAll(n => n % 2 == 0);
int removed2 = list.RemoveAll(n => n > 5);

4.5 Clear方法 #

csharp
var list = new List<int> { 1, 2, 3 };
list.Clear();

五、查找元素 #

5.1 Contains方法 #

csharp
var list = new List<string> { "张三", "李四", "王五" };

bool hasZhangSan = list.Contains("张三");
bool hasNotFound = list.Contains("赵六");

5.2 IndexOf方法 #

csharp
var list = new List<string> { "张三", "李四", "王五", "李四" };

int first = list.IndexOf("李四");
int last = list.LastIndexOf("李四");
int notFound = list.IndexOf("赵六");

5.3 Find方法 #

csharp
var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int firstEven = list.Find(n => n % 2 == 0);
int lastEven = list.FindLast(n => n % 2 == 0);
int firstGreaterThan5 = list.Find(n => n > 5);

5.4 FindAll方法 #

csharp
var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var evens = list.FindAll(n => n % 2 == 0);
var greaterThan5 = list.FindAll(n => n > 5);

5.5 FindIndex方法 #

csharp
var list = new List<int> { 1, 2, 3, 4, 5 };

int firstEvenIndex = list.FindIndex(n => n % 2 == 0);
int lastEvenIndex = list.FindLastIndex(n => n % 2 == 0);

5.6 Exists方法 #

csharp
var list = new List<int> { 1, 2, 3, 4, 5 };

bool hasEven = list.Exists(n => n % 2 == 0);
bool hasGreaterThan10 = list.Exists(n => n > 10);

5.7 TrueForAll方法 #

csharp
var list = new List<int> { 2, 4, 6, 8, 10 };

bool allEven = list.TrueForAll(n => n % 2 == 0);
bool allPositive = list.TrueForAll(n => n > 0);

六、排序 #

6.1 Sort方法 #

csharp
var list = new List<int> { 5, 2, 8, 1, 9, 3 };
list.Sort();

var names = new List<string> { "张三", "李四", "王五" };
names.Sort();

6.2 自定义排序 #

csharp
var list = new List<int> { 5, 2, 8, 1, 9, 3 };
list.Sort((a, b) => b.CompareTo(a));

var people = new List<Person>
{
    new Person { Name = "张三", Age = 25 },
    new Person { Name = "李四", Age = 30 },
    new Person { Name = "王五", Age = 20 }
};

people.Sort((a, b) => a.Age.CompareTo(b.Age));
people.Sort((a, b) => string.Compare(a.Name, b.Name));

6.3 Reverse方法 #

csharp
var list = new List<int> { 1, 2, 3, 4, 5 };
list.Reverse();

6.4 OrderBy(LINQ) #

csharp
var list = new List<int> { 5, 2, 8, 1, 9, 3 };

var sorted = list.OrderBy(n => n).ToList();
var descending = list.OrderByDescending(n => n).ToList();

七、转换 #

7.1 ToArray方法 #

csharp
var list = new List<int> { 1, 2, 3, 4, 5 };
int[] array = list.ToArray();

7.2 ConvertAll方法 #

csharp
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var strings = numbers.ConvertAll(n => n.ToString());
var doubled = numbers.ConvertAll(n => n * 2);

7.3 GetRange方法 #

csharp
var list = new List<int> { 1, 2, 3, 4, 5 };
var subList = list.GetRange(1, 3);

7.4 AsReadOnly方法 #

csharp
var list = new List<int> { 1, 2, 3 };
IReadOnlyList<int> readOnly = list.AsReadOnly();

八、容量管理 #

8.1 Capacity属性 #

csharp
var list = new List<int>();
Console.WriteLine($"初始容量:{list.Capacity}");

for (int i = 0; i < 10; i++)
{
    list.Add(i);
    Console.WriteLine($"Count={list.Count}, Capacity={list.Capacity}");
}

8.2 预设容量 #

csharp
var list = new List<int>(1000);

list.EnsureCapacity(1000);
list.TrimExcess();

九、实战示例 #

9.1 分页列表 #

csharp
public static List<T> GetPage<T>(List<T> list, int page, int pageSize)
{
    return list.Skip((page - 1) * pageSize).Take(pageSize).ToList();
}

var items = Enumerable.Range(1, 100).ToList();
var page1 = GetPage(items, 1, 10);
var page2 = GetPage(items, 2, 10);

9.2 去重 #

csharp
public static List<T> Distinct<T>(List<T> list)
{
    return list.Distinct().ToList();
}

public static List<T> DistinctBy<T, TKey>(List<T> list, Func<T, TKey> keySelector)
{
    return list.GroupBy(keySelector).Select(g => g.First()).ToList();
}

9.3 分组 #

csharp
var people = new List<Person>
{
    new Person { Name = "张三", Age = 25, City = "北京" },
    new Person { Name = "李四", Age = 30, City = "上海" },
    new Person { Name = "王五", Age = 25, City = "北京" }
};

var byAge = people.GroupBy(p => p.Age);
var byCity = people.GroupBy(p => p.City);

十、总结 #

List要点:

操作 方法
添加 Add, AddRange, Insert
删除 Remove, RemoveAt, RemoveAll
查找 Find, FindAll, Contains
排序 Sort, OrderBy
转换 ToArray, ConvertAll

下一步,让我们学习Set集合!

最后更新:2026-03-26