C#中List操作方法详解

在C#编程中,特别是在WPF应用开发(同样适用于.NET 9.0环境)时,List<T>是一个非常常用的集合类型,它提供了丰富的操作方法来方便地管理和处理数据。以下是对List<T>常见操作方法的详细介绍,帮助初学者快速掌握其使用方式。

一、创建List

在使用List<T>之前,首先需要创建它的实例。List<T>是一个泛型集合,意味着可以指定其中元素的类型(用<T>表示),例如可以创建存储整数、字符串、自定义对象等不同类型元素的列表。

代码示例

// 创建一个存储整数的List<int>
List<int> numberList = new List<int>();
// 创建一个存储字符串的List<string>
List<string> stringList = new List<string>();

二、添加元素

1. 添加单个元素到末尾(Add方法)

使用Add方法可以将单个元素添加到List<T>的末尾位置。每次调用Add方法,元素就会按添加顺序依次排列在列表中。

代码示例

List<string> fruitList = new List<string>();
fruitList.Add("Apple");
fruitList.Add("Banana");
// 此时 fruitList 包含两个元素,分别为 "Apple" 和 "Banana"

2. 添加一组元素(AddRange方法)

如果有多个元素需要一次性添加到List<T>中,可以使用AddRange方法。该方法接收一个实现了IEnumerable<T>接口的集合(例如数组、另一个List<T>等),然后将集合中的所有元素依次添加到当前List<T>的末尾。

代码示例

List<int> numberList = new List<int>();
int[] numbersToAdd = { 1, 2, 3 };
numberList.AddRange(numbersToAdd);
// 此时 numberList 变为 {1, 2, 3},将数组中的元素全部添加到了列表末尾

三、访问元素

可以通过索引来访问List<T>中的元素,索引从0开始,即第一个元素的索引是0,第二个元素的索引是1,依此类推。

代码示例

List<double> scoreList = new List<double> { 90.5, 85.0, 92.0 };
double firstScore = scoreList[0]; // 获取第一个元素,值为 90.5
double secondScore = scoreList[1]; // 获取第二个元素,值为 85.0

四、修改元素

通过指定元素的索引位置,可以修改该位置上的元素值。

代码示例

List<char> charList = new List<char> { 'a', 'b', 'c' };
charList[1] = 'd'; // 将索引为1的元素修改为 'd',此时 charList 变为 {'a', 'd', 'c'}

五、删除元素

1. 按索引删除元素(RemoveAt方法)

使用RemoveAt方法可以根据指定的索引位置删除元素,被删除元素后面的元素会自动向前移动一位,填补空缺位置。

代码示例

List<DateTime> dateTimeList = new List<DateTime> { DateTime.Now, DateTime.Now.AddDays(1), DateTime.Now.AddDays(2) };
dateTimeList.RemoveAt(1); // 删除索引为1的元素,即第二个元素
// 此时 dateTimeList 只剩下两个元素,分别是第一个和第三个元素

2. 按元素值删除(首次出现的匹配元素)(Remove方法)

Remove方法用于删除列表中首次出现的指定元素值。如果列表中存在该元素,则将其删除,后面的元素会向前移动一位;如果不存在,则不做任何操作。

代码示例

List<string> nameList = new List<string> { "Tom", "Jerry", "Tom" };
nameList.Remove("Tom"); // 会删除首次出现的 "Tom",此时列表变为 {"Jerry", "Tom"}

3. 删除所有满足条件的元素(RemoveAll方法)

结合RemoveAll方法与lambda表达式,可以删除列表中所有满足特定条件的元素。RemoveAll方法会遍历整个列表,对每个元素应用给定的条件判断(通过lambda表达式定义),符合条件的元素都会被删除。

代码示例

List<int> numList = new List<int> { 1, 2, 3, 4, 5 };
numList.RemoveAll(x => x % 2 == 0); // 删除所有偶数元素,此时列表变为 {1, 3, 5}

六、查找元素

1. 查找元素是否存在(Contains方法)

使用Contains方法可以判断指定元素是否存在于List<T>中,返回值为bool类型,true表示存在,false表示不存在。

代码示例

List<string> cityList = new List<string> { "Beijing", "Shanghai", "Guangzhou" };
bool exists = cityList.Contains("Shanghai"); // 返回 true,因为列表中存在 "Shanghai"

2. 查找元素索引(首次出现的索引)(IndexOf方法)

IndexOf方法用于查找指定元素在列表中首次出现的索引位置,如果元素不存在,则返回-1

代码示例

List<int> numberList = new List<int> { 10, 20, 30, 20 };
int index = numberList.IndexOf(20); // 返回 1,即首次出现20的索引位置

七、排序

1. 使用默认排序规则排序(Sort方法)

对于一些基本数据类型(如整数、字符串等),List<T>Sort方法会按照默认的比较规则对元素进行升序排序。

代码示例

List<int> unsortedList = new List<int> { 5, 3, 8, 1 };
unsortedList.Sort(); // 对列表进行升序排序,此时列表变为 {1, 3, 5, 8}

2. 使用自定义比较器排序

如果需要按照特定的规则对元素进行排序(例如按照自定义对象的某个属性排序),可以通过向Sort方法传递一个自定义的比较器(通常以lambda表达式形式)来实现。

代码示例
假设定义了一个简单的Person类:

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

按照Person对象的年龄进行升序排序的代码如下:

List<Person> personList = new List<Person>
{
    new Person("Tom", 25),
    new Person("Jerry", 30),
    new Person("Mike", 20)
};
personList.Sort((x, y) => x.Age.CompareTo(y.Age));
// 此时 personList 会按照年龄升序排序,元素顺序会相应改变

八、遍历元素

1. 使用for循环遍历

通过for循环结合列表的Count属性(用于获取元素个数),可以按照索引顺序依次访问列表中的每个元素。

代码示例

List<int> intList = new List<int> { 1, 2, 3 };
for (int i = 0; i < intList.Count; i++)
{
    Console.WriteLine(intList[i]);
}

2. 使用foreach循环遍历

foreach循环提供了一种更简洁的方式来遍历列表元素,它会自动迭代列表中的每个元素,无需手动管理索引。

代码示例

List<string> stringList = new List<string> { "one", "two", "three" };
foreach (string s in stringList)
{
    Console.WriteLine(s);
}

九、获取元素数量

使用Count属性可以获取List<T>中当前包含的元素个数。

代码示例

List<object> objectList = new List<object>();
int count = objectList.Count; // 获取当前列表元素个数,初始为0

十、清空列表

使用Clear方法可以移除List<T>中的所有元素,使列表变为空列表,元素个数变为0

代码示例

List<decimal> decimalList = new List<decimal> { 1.0m, 2.0m };
decimalList.Clear(); // 执行后列表为空,元素个数为0

十一、插入元素

1. 在指定索引位置插入单个元素(Insert方法)

Insert方法用于将一个元素插入到List<T>的指定索引位置,插入后该索引位置及其后面的元素都会往后移动一位。

代码示例

List<int> numberList = new List<int> { 1, 3, 4 };
numberList.Insert(1, 2);  // 在索引为1的位置插入元素2
// 此时 numberList 变为 {1, 2, 3, 4}

2. 在指定索引位置插入一组元素(InsertRange方法)

InsertRange方法允许将一个实现了IEnumerable<T>接口的集合中的多个元素插入到List<T>的指定索引位置,同样会使该索引位置及其后面的元素往后移动相应的位数。

代码示例

List<int> numberList = new List<int> { 1, 3, 5 };
List<int> numbersToInsert = new List<int> { 2, 4 };
numberList.InsertRange(1, numbersToInsert);
// 此时 numberList 变为 {1, 2, 4, 3, 5},在索引为1的位置插入了 numbersToInsert 集合中的元素

十二、查找满足条件的元素

1. 查找满足条件的第一个元素(Find方法)

Find方法会在列表中查找满足指定条件的第一个元素,并返回该元素。如果没有找到符合条件的元素,则返回默认值(对于引用类型返回null,对于值类型返回相应的默认值,比如int类型返回0等)。

代码示例

List<int> numberList = new List<int> { 10, 20, 30, 40 };
int result = numberList.Find(x => x > 20 && x < 40);
// 会返回 30,因为 30 是满足条件(大于20且小于40)的第一个元素

2. 查找满足条件的所有元素(FindAll方法)

FindAll方法用于查找列表中所有满足指定条件的元素,并返回一个新的List<T>,其中包含了所有符合条件的元素。

代码示例

List<int> numberList = new List<int> { 5, 10, 15, 20, 25 };
List<int> resultList = numberList.FindAll(x => x % 5 == 0 && x > 10);
// 会返回一个新的 List<int> ,包含 {15, 20, 25},这些元素都满足条件(能被5整除且大于10)

3. 查找满足条件的第一个元素的索引(FindIndex方法)

FindIndex方法用于查找列表中满足指定条件的第一个元素的索引位置。如果没有找到符合条件的元素,则返回-1

代码示例

List<string> stringList = new List<string> { "apple", "banana", "cherry" };
int index = stringList.FindIndex(s => s.StartsWith("b"));
// 会返回 1,因为 "banana" 是首个满足以 "b" 开头这一条件的元素,其索引为1

4. 从末尾开始查找满足条件的第一个元素(FindLast方法)

FindLast方法类似于Find方法,但它是从列表末尾开始查找满足指定条件的第一个元素。

代码示例

List<int> numberList = new List<int> { 10, 20, 30, 20 };
int result = numberList.FindLast(x => x == 20);
// 会返回 3,因为从后往前看,最后一个等于20的元素索引为3

5. 从末尾开始查找满足条件的第一个元素的索引(FindLastIndex方法)

FindLastIndex方法与FindIndex类似,不过是从列表末尾开始查找满足指定条件的第一个元素的索引位置,若未找到则返回-1

代码示例

List<string> stringList = new List<string> { "apple", "banana", "cherry" };
int index = stringList.FindLastIndex(s => s.Length > 5);
// 会返回 2,因为 "cherry" 是从后往前看首个满足长度大于5这一条件的元素,其索引为2

6. 判断所有元素是否满足条件(TrueForAll方法)

TrueForAll方法用于判断列表中所有元素是否都满足指定的条件,如果是则返回true,否则返回false

代码示例

List<int> numberList = new List<int> { 2, 4, 6, 8 };
bool allEven = numberList.TrueForAll(x => x % 2 == 0);
// 会返回 true,因为列表中所有元素都是偶数,都满足能被2整除的条件

通过掌握以上这些List<T>的操作方法,能够更加灵活地运用List<T>来处理各种数据集合相关的需求,在C#编程中高效地进行数据管理和操作。希望这份文档对初学者学习List<T>有所帮助。