返回 C#常用知识小短篇

List<T>常用方法

以下为完整正文内容。

正文

List<T> 是 C# 里最常用的集合类型,用来装一组相同类型的数据。 数组长度固定,List 可以随便加随便删,不用提前指定大小。 var names = new List<string>(); // 空列表 var nums = new List<int> { 1, 2, 3 }; // 带初始值 T 是泛型占位符,List<string> 就是装字符串的列表,List<int> 就是装整数的列表。一个 List 里只能装同一种类型。 Add 往末尾加一个元素,AddRange 一次加一批。是最常用的追加方法 var list = new List<string>(); list.Add("张三"); // 加一个 list.AddRange(new[] { "李四", "王五" }); // 一次加多个 // 现在 list 里: ["张三", "李四", "王五"] Insert 往指定位置插入,InsertRange 一次插入一批。 var list = new List<string> { "张三", "王五" }; list.Insert(1, "李四"); // 在索引1位置插入,["张三", "李四", "王五"] 插入会让后面的元素全部往后移,数据量大时比 Add 慢。尽量用 Add,必须要指定位置再用 Insert。 通过索引访问和修改元素,和数组一样用 [ ]。 var list = new List<string> { "张三", "李四", "王五" }; Console.WriteLine(list[0]); // "张三" list[1] = "赵六"; // 修改索引1的元素 // 现在 list: ["张三", "赵六", "王五"] 索引从 0 开始,超出范围会抛异常。List 有 Count 属性告诉你总共有多少个元素。 Remove 删掉第一个匹配的元素,RemoveAt 按索引删,RemoveAll 按条件批量删。 var list = new List<string> { "张三", "李四", "张三", "王五" }; list.Remove("张三"); // 删掉第一个"张三",剩下 ["李四", "张三", "王五"] list.RemoveAt(1); // 删掉索引1的元素,剩下 ["李四", "王五"] var nums = new List<int> { 1, 2, 3, 4, 5, 6 }; nums.RemoveAll(n => n > 4); // 删掉所有大于4的,剩下 [1, 2, 3, 4] Remove 返回值是 bool,删成功了返回 true,没找到返回 false。 Contains 判断是否存在,IndexOf 找第一个匹配的位置,Find 按条件找元素。 var list = new List<string> { "张三", "李四", "王五" }; bool has = list.Contains("李四"); // true int idx = list.IndexOf("李四"); // 1,没找到返回 -1 var nums = new List<int> { 1, 2, 3, 4, 5 }; int first = nums.Find(n => n > 3); // 4,第一个大于3的 List<int> all = nums.FindAll(n => n > 3); // [4, 5],所有大于3的 Find 找不到返回默认值(int 返回 0,string 返回 null)。FindAll 一定返回一个列表,没找到就是空列表。 Sort 排序,Reverse 反转顺序。 var nums = new List<int> { 3, 1, 4, 2 }; nums.Sort(); // [1, 2, 3, 4] 升序 nums.Reverse(); // [4, 3, 2, 1] 反转 自定义排序传 Lambda 表达式,用两个元素的比较来排 var users = new List<User> { ... }; users.Sort((a, b) => a.Age.CompareTo(b.Age)); // 按年龄升序 CompareTo 返回负数表示 a 在前,正数表示 b 在前,0 表示相等。 Count 获取元素总数,Clear 清空所有元素。 var list = new List<string> { "张三", "李四", "王五" }; Console.WriteLine(list.Count); // 3 list.Clear(); // 全删,变成空列表 Count 是属性不是方法,不加括号。Clear 之后列表还在,只是空了,可以继续往里 Add。 ForEach 遍历每个元素执行指定操作。 var list = new List<string> { "张三", "李四", "王五" }; list.ForEach(name => Console.WriteLine(name)); // 输出:张三 李四 王五(每个一行) 和 foreach 循环效果一样,写法更紧凑。但不能在 ForEach 里用 break 跳出或 return 提前结束。需要中途退出的遍历就用 foreach。 List<T> 配合 LINQ 效果更好。 var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 }; var result = nums .Where(n => n > 3) // 筛选大于3的 .OrderByDescending(n => n) // 降序排列 .Select(n => n * 10) // 每个乘以10 .Take(3) // 取前3个 .ToList(); // 执行,得到 [80, 70, 60] 链式调用,筛选、排序、转换、截取。 ToList 是最后一步,触发执行。 综合举例 var students = new List<string> { "张三", "李四", "王五" }; Console.WriteLine($"初始:{string.Join(", ", students)},共{students.Count}人"); // 添加 students.Add("赵六"); // 末尾加一个 students.AddRange(new[] { "孙七", "周八" }); // 一次加一批 Console.WriteLine($"添加后:{string.Join(", ", students)},共{students.Count}人"); // 插入 students.Insert(3, "陈九"); // 在索引3位置插入 Console.WriteLine($"插入后:{string.Join(", ", students)}"); // 索引访问和修改 Console.WriteLine($"第一名:{students[0]}"); // 索引访问 students[0] = "张三丰"; // 索引修改 Console.WriteLine($"改名后第一名:{students[0]}"); // 查找和判断 bool has = students.Contains("李四"); // 是否存在 int idx = students.IndexOf("李四"); // 找位置 Console.WriteLine($"李四存在吗:{has},位置:{idx}"); // 按条件查找 var startsWithZ = students.Find(n => n.StartsWith("赵")); // 找第一个 var allZ = students.FindAll(n => n.StartsWith("赵")); // 找全部 Console.WriteLine($"第一个姓赵的:{startsWithZ}"); Console.WriteLine($"所有姓赵的:{string.Join(", ", allZ)}"); // 遍历 Console.WriteLine("\n全部学生:"); students.ForEach(s => Console.WriteLine($" {s}")); // 排序 students.Sort(); // 升序 Console.WriteLine($"\n升序:{string.Join(", ", students)}"); students.Reverse(); // 反转 Console.WriteLine($"反转:{string.Join(", ", students)}"); // 删除 students.Remove("赵六"); // 按值删 students.RemoveAt(1); // 按索引删 Console.WriteLine($"\n删除后:{string.Join(", ", students)},共{students.Count}人"); // 条件批量删除 students.RemoveAll(s => s.StartsWith("赵")); // 删所有姓赵的 Console.WriteLine($"删姓赵的:{string.Join(", ", students)}"); // LINQ 链式查询 var scores = new List<int> { 45, 78, 90, 33, 88, 62, 95, 41 }; var top3 = scores .Where(s => s >= 60) // 及格 .OrderByDescending(s => s) // 降序 .Take(3) // 前三名 .ToList(); Console.WriteLine($"\n前三名:{string.Join(", ", top3)}"); // 清空 students.Clear(); Console.WriteLine($"\n清空后:共{students.Count}人"); 输出结果: 初始:张三, 李四, 王五,共3人 添加后:张三, 李四, 王五, 赵六, 孙七, 周八,共6人 插入后:张三, 李四, 王五, 陈九, 赵六, 孙七, 周八 第一名:张三 改名后第一名:张三丰 李四存在吗:True,位置:1 第一个姓赵的:赵六 所有姓赵的:赵六 全部学生: 张三丰 李四 王五 陈九 赵六 孙七 周八 升序:张三丰, 李四, 王五, 孙七, 周八, 赵六, 陈九 反转:陈九, 赵六, 周八, 孙七, 王五, 李四, 张三丰 删除后:陈九, 周八, 孙七, 王五, 张三丰,共5人 删姓赵的:陈九, 周八, 孙七, 王五, 张三丰 前三名:95, 90, 88 清空后:共0人