位置: 文档库 > C#(.NET) > C# list使用方法

C# list使用方法

宋轶 上传于 2020-04-13 17:14

《C# List使用方法》

在C#编程中,List是.NET Framework提供的一个动态数组集合类,位于System.Collections.Generic命名空间下。与传统的数组相比,List具有动态扩容、类型安全、丰富的内置方法等优势,是处理有序数据集合时的首选工具。本文将系统讲解List的核心用法,涵盖创建、增删改查、排序、转换等操作,并通过实际案例展示其应用场景。

一、List基础

List是一个泛型集合类,T表示集合中元素的类型。创建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();

七、最佳实践总结

  1. 合理设置初始Capacity以减少扩容开销
  2. 优先使用泛型方法保证类型安全
  3. 对大型列表操作考虑性能影响
  4. 多线程环境下使用同步机制
  5. 结合LINQ简化复杂操作

关键词:C#、List、泛型集合、动态数组、增删改查、排序、LINQ、性能优化、多线程

简介:本文全面介绍了C#中List集合类的使用方法,包括创建、元素操作、排序转换、高级应用及实际案例。通过代码示例和性能优化建议,帮助开发者高效利用List处理各种数据集合场景。