C#List教程展示了如何在C#中使用List集合。C#教程是C#语言的综合教程。
C#列表
C#List表示可以通过索引访问的对象的强类型列表。它提供了搜索、排序和操作列表的方法。
C#列表初始化器
C#列表可以用文字表示法进行初始化。这些元素被添加到赋值的右侧,在{}
方括号内。
using System; using System.Collections.Generic; var words = new List<string> { "forest", "oak", "river", "falcon" }; Console.WriteLine(string.Join(", ", words));
在示例中,我们使用列表初始值设定项创建一个字符串列表。
var words = new List<string>{"forest", "oak", "river", "falcon"};
创建了一个新列表。在尖括号>
之间,我们指定列表元素的数据类型。
Console.WriteLine(string.Join(", ", words));
为了快速查看列表的内容,我们将所有值连接成一个字符串,用逗号分隔。
$ dotnet run forest, oak, river, falcon
C#列表计数元素
通过Count
属性,我们可以获得列表中元素的数量。
using System; using System.Collections.Generic; var vals = new List<int> { 0, 1, 2, 3, 4, 5 }; Console.WriteLine($"There are {vals.Count} elements in the list");
该示例计算列表中元素的数量。
Console.WriteLine($"There are {vals.Count} elements in the list");
这里我们打印列表中元素的数量。
$ dotnet run There are 6 elements in the list
C#列表访问元素
可以使用索引符号[]
访问列表的元素。索引从零开始。
using System; using System.Collections.Generic; var vals = new List<int>{ 0, 1, 2, 3, 4, 5 }; Console.WriteLine(vals[0]); Console.WriteLine(vals[1]); Console.WriteLine(vals.Count - 1); Console.WriteLine(vals[^1]); Console.WriteLine(vals[^2]);
该示例打印列表的第一个、第二个和最后一个元素。
Console.WriteLine(vals.Count - 1);
为了得到列表的最后一个元素,我们计算元素的数量并除以一个。
Console.WriteLine(vals[^1]); Console.WriteLine(vals[^2]);
使用^
运算符,我们可以访问列表末尾的元素。
$ dotnet run 0 1 5 5 4
C#列表添加元素
Add
方法在列表末尾添加一个元素。AddRange
方法将指定集合的元素添加到列表的末尾。
using System; using System.Collections.Generic; var words = new List<string> { "forest", "oak", "river", "falcon" }; words.Add("sky"); words.Add("ocean"); var words2 = new string[] { "owl", "hawk" }; words.AddRange(words2); Console.WriteLine(String.Join(',', words));
该示例创建一个新列表并向其添加新元素。
words.Add("sky"); words.Add("ocean");
使用Add
将两个元素添加到列表中。
var words2 = new string[] {"owl", "hawk"}; words.AddRange(words2);
使用AddRange
方法,我们将另一个集合添加到列表中。
$ dotnet run forest,oak,river,falcon,sky,ocean,owl,hawk
C#列表插入元素
Insert
方法将一个元素插入列表中指定的索引处。InsertRange
将集合的元素插入到指定索引处的列表中。
using System; using System.Collections.Generic; var words = new List<string> { "forest", "oak", "river", "falcon" }; words.Insert(0, "sky"); words.Insert(words.Count, "cloud"); var words2 = new List<string> { "water", "wave" }; words.InsertRange(2, words2); Console.WriteLine(string.Join(", ", words));
该示例创建一个新的单词列表并向其中插入新元素。
$ dotnet run sky, forest, water, wave, oak, river, falcon, cloud
C#列表包含
Contains
方法确定元素是否在列表中。
using System; using System.Collections.Generic; var words = new List<string> { "forest", "oak", "river", "falcon" }; if (words.Contains("oak")) { Console.WriteLine("The list contains the oak word"); }
在示例中,我们检查oak
单词是否在列表中。
C#列表删除元素
Remove
、RemoveAt
、RemoveAll
、RemoveRange
和Clear
方法可用于从列表中删除元素。
using System; using System.Collections.Generic; var nums = new List<int> { 0, 1, 2, -3, 4, -5, 6, 7, -8, 9, 10 }; nums.RemoveAll(e => e < 0); Console.WriteLine(string.Join(", ", nums)); nums.Remove(0); nums.RemoveAt(nums.Count - 1); Console.WriteLine(string.Join(", ", nums)); nums.RemoveRange(0, 3); Console.WriteLine(string.Join(", ", nums)); nums.Clear(); Console.WriteLine("{0}", nums.Count);
在示例中,我们从整数列表中删除元素。
nums.RemoveAll(e => e < 0); Console.WriteLine(string.Join(", ", nums));
使用RemoveAll
方法,我们删除所有满足给定谓词的元素;在我们的例子中,我们删除了所有负值。
nums.Remove(0);
Remove
方法删除第一次出现的0值。
nums.RemoveAt(nums.Count - 1);
使用RemoveAt
,我们删除给定索引处的元素。
nums.RemoveRange(0, 3);
RemoveRange
方法从列表中删除给定范围的值。参数是要移除的元素范围的从零开始的索引和要移除的元素的数量。
C#ListToArray
ToArray
方法将列表的元素复制到数组中。
using System; using System.Collections.Generic; var nums = new List<int> { 1, 2, 3, 4 }; Console.WriteLine(nums.GetType()); var nums2 = nums.ToArray(); Console.WriteLine(nums2.GetType());
在示例中,我们从列表创建一个数组。我们使用GetType
打印两个容器的类型。
$ dotnet run System.Collections.Generic.List`1[System.Int32] System.Int32[]
C#ListForEach
ForEach
方法对列表的每个元素执行指定的操作。
using System; using System.Collections.Generic; var words = new List<string> { "forest", "oak", "river", "falcon" }; words.ForEach(Console.WriteLine); words.ForEach(word => Console.WriteLine(word.ToUpper()));
我们对单词列表调用了两次ForEach
方法。
words.ForEach(Console.WriteLine);
我们打印列表的所有元素。
words.ForEach(word => Console.WriteLine(word.ToUpper()));
这里我们也打印列表的所有元素;单词被转换为大写。
$ dotnet run forest oak river falcon FOREST OAK RIVER FALCON
C#循环列表
有几种循环遍历C#列表的方法。
using System; using System.Collections.Generic; var nums = new List<int> {1, 2, 3, 4}; nums.ForEach(e => Console.WriteLine(e)); Console.WriteLine("********************"); foreach(int e in nums) { Console.WriteLine(e); } Console.WriteLine("********************"); for (int i = 0; i < nums.Count; i++) { Console.WriteLine(nums[i]); }
该示例展示了在C#中循环遍历列表的三种方法。
nums.ForEach(e => Console.WriteLine(e));
我们使用ForEach
遍历一个列表。
foreach(int e in nums) { Console.WriteLine(e); }
在这种情况下,我们使用foreach
语句。
for (int i = 0; i < nums.Count; i++) { Console.WriteLine(nums[i]); }
最后,这是经典的for循环。
$ dotnet run 1 2 3 4 ******************** 1 2 3 4 ******************** 1 2 3 4
C#排序,反转List
Sort
方法对列表的元素进行排序,Reverse
方法对列表的元素进行反转。
using System; using System.Collections.Generic; var nums = new List<int> {2, 1, 5, 4, 3}; nums.Reverse(); Console.WriteLine(string.Join(',', nums)); nums.Sort(); Console.WriteLine(string.Join(',', nums));
该示例反转整数列表的元素,然后对它们进行排序。
$ dotnet run 3,4,5,1,2 1,2,3,4,5
C#列表查找
FindAll
方法检索列表中与指定谓词定义的条件匹配的所有元素。它返回一个列表,其中包含与指定谓词定义的条件匹配的所有元素(如果找到);否则,一个空列表。
谓词是一种返回布尔值的方法。要了解有关谓词的更多信息,请访问C#谓词教程。
using System; using System.Collections.Generic; var vals = new List<int> {-1, -3, 0, 1, 3, 2, 9, -4}; List<int> filtered = vals.FindAll(e => e > 0); Console.WriteLine(string.Join(',', filtered));
该示例找到所有正元素。
List<int> filtered = vals.FindAll(e => e > 0);
谓词是一个对大于零的值返回真值的表达式。
$ dotnet run 1,3,2,9
这些是列表的正值。
C#列表查找、FindLast、FindIndex、FindLastIndex
Find
方法返回与给定谓词匹配的元素的第一次出现。FindLast
方法返回与给定谓词匹配的元素的最后出现。
FindIndex
方法返回与给定谓词匹配的元素第一次出现的索引。FindLastIndex
方法返回与给定谓词匹配的元素的最后一次出现的索引。
using System; using System.Collections.Generic; var nums = new List<int> { 6, -2, 1, 5, 4, 3, 2, 9, -1, 7 }; var found = nums.Find(e => e < 0); Console.WriteLine(found); var found2 = nums.FindIndex(e => e < 0); Console.WriteLine(found2); var found3 = nums.FindLast(e => e < 0); Console.WriteLine(found3); var found4 = nums.FindLastIndex(e => e < 0); Console.WriteLine(found4);
该示例使用所有提到的方法来查找元素和索引。
$ dotnet run -2 1 -1 8
C#列表转换所有
ConvertAll
方法将当前List中的元素转换为另一种类型,并返回包含转换后元素的列表。
using System; using System.Collections.Generic; var words = new List<string>(); words.Add("falcon"); words.Add("owl"); words.Add("sky"); words.Add("hawk"); words.Add("stork"); List<string> uppedWords = words.ConvertAll(s => s.ToUpper()); List<int> lengths = words.ConvertAll(s => s.Length); Console.WriteLine(string.Join(", ", uppedWords)); Console.WriteLine(string.Join(", ", lengths));
在示例中,我们有一个单词列表。我们将该列表转换为另外两个列表。
List<string> uppedWords = words.ConvertAll(s => s.ToUpper());
这里我们将列表转换为包含转换为大写的单词的列表。
List<int> lengths = words.ConvertAll(s => s.Length);
在第二种情况下,转换后的列表包含的整数是原始列表中单词的长度。
$ dotnet run FALCON, OWL, SKY, HAWK, STORK 6, 3, 3, 4, 5
在第二个示例中,我们有一个单独的squareRoot
方法,它应用于整数列表。
using System; using System.Collections.Generic; double squareRoot(int x) { return Math.Sqrt(x); } var vals = new List<int> { 1, 4, 9, 16, 25 }; Converter<int, double> converter = squareRoot; List<double> vals2 = vals.ConvertAll<double>(converter); System.Console.WriteLine(string.Join(", ", vals2));
在示例中,我们通过对整数列表应用平方根运算来创建一个新列表。
$ dotnet run 1, 2, 3, 4, 5
C#列表随机播放
以下示例随机重建整数值列表。
using System; using System.Linq; using System.Collections.Generic; var vals = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 }; vals.Shuffle(); var res = string.Join(" ", vals); Console.WriteLine(res); static class MyExtensions { private static Random rng = new Random(); public static void Shuffle<T>(this IList<T> vals) { int n = vals.Count; while (n > 1) { n--; int k = rng.Next(n + 1); T value = vals[k]; vals[k] = vals[n]; vals[n] = value; } } }
在示例中,我们创建了一个Shuffle
扩展方法。它就地打乱元素。
public static void Shuffle<T>(this IList<T> vals) { int n = vals.Count; while (n > 1) { n--; int k = rng.Next(n + 1); T value = vals[k]; vals[k] = vals[n]; vals[n] = value; } }
这是Fisher–Yates洗牌算法的实现。
$ dotnet run 7 1 5 6 4 2 3 8 $ dotnet run 7 5 4 1 2 3 6 8 $ dotnet run 2 3 8 5 1 4 7 6 $ dotnet run 4 5 1 6 8 2 3 7
C#列表TrueForAll
TrueForAll
确定列表中的每个元素是否匹配给定谓词定义的条件。
using System; using System.Collections.Generic; var nums = new List<int> {1, 2, 3, 4, 5, 6, 7, 8}; var res1 = nums.TrueForAll(e => e % 2 == 0); Console.WriteLine(res1); var res2 = nums.TrueForAll(e => e > 0); Console.WriteLine(res2);
在这个例子中,我们检查列表中的元素是否都是偶数并且它们都是正数。
$ dotnet run False True
并非所有元素都是偶数,所有元素都是正数。
林克
语言集成查询(LINQ)是一组基于将查询功能直接集成到C#语言中的技术的名称。
通过LINQ,C#公开了大量处理列表数据的方法。
C#列表聚合计算
LINQ有扩展方法来计算聚合计算,例如min、max或sum。
var vals = new List<int> { -1, 2, 1, -3, 7, -9, 5, 9, -4, 8 }; var n1 = vals.Count(); Console.WriteLine($"There are {n1} elements"); var n2 = vals.Count(e => e % 2 == 0); Console.WriteLine($"There are {n2} even elements"); var sum = vals.Sum(); Console.WriteLine($"The sum of all values is: {sum}"); var s2 = vals.Sum(e => e > 0 ? e : 0); Console.WriteLine($"The sum of all positive values is: {s2}"); var avg = vals.Average(); Console.WriteLine($"The average of values is: {avg}"); var max = vals.Max(); Console.WriteLine($"The maximum value is: {max}"); var min = vals.Min(); Console.WriteLine($"The minimum value is: {min}");
在程序中,我们使用了Count、Sum、Average、Max和Min方法。
$ dotnet run There are 10 elements There are 3 even elements The sum of all values is: 15 The sum of all positive values is: 32 The average of values is: 1.5 The maximum value is: 9 The minimum value is: -9
C#列表排序
要对数据进行排序,我们可以使用OrderBy
和ThenBy
扩展方法。请注意,这些方法创建了一个新的修改列表;原名单不变。
var users = new List<User> { new ("John", "Doe", 1230), new ("Lucy", "Novak", 670), new ("Ben", "Walter", 2050), new ("Robin", "Brown", 2300), new ("Amy", "Doe", 1250), new ("Joe", "Draker", 1190), new ("Janet", "Doe", 980), new ("Albert", "Novak", 1930), }; Console.WriteLine("sort ascending by last name and salary"); var sortedUsers = users.OrderBy(u => u.LastName).ThenBy(u => u.Salary); foreach (var user in sortedUsers) { Console.WriteLine(user); } Console.WriteLine("---------------------"); Console.WriteLine("sort descending by last name and salary"); var sortedUsers2 = users.OrderByDescending(u => u.LastName) .ThenByDescending(u => u.Salary); foreach (var user in sortedUsers2) { Console.WriteLine(user); } record User(string FirstName, string LastName, int Salary);
我们有一个用户列表。用户首先按姓氏排序,然后按工资排序。
var sortedUsers = users.OrderBy(u => u.LastName).ThenBy(u => u.Salary);
我们按姓氏对用户进行排序,然后按工资升序对用户进行排序。
var sortedUsers2 = users.OrderByDescending(u => u.LastName) .ThenByDescending(u => u.Salary);
在这里,我们先按姓氏对用户进行排序,然后按工资降序排列。
$ dotnet run sort ascending by last name and salary User { FirstName = Robin, LastName = Brown, Salary = 2300 } User { FirstName = Janet, LastName = Doe, Salary = 980 } User { FirstName = John, LastName = Doe, Salary = 1230 } User { FirstName = Amy, LastName = Doe, Salary = 1250 } User { FirstName = Joe, LastName = Draker, Salary = 1190 } User { FirstName = Lucy, LastName = Novak, Salary = 670 } User { FirstName = Albert, LastName = Novak, Salary = 1930 } User { FirstName = Ben, LastName = Walter, Salary = 2050 } --------------------- sort descending by last name and salary User { FirstName = Ben, LastName = Walter, Salary = 2050 } User { FirstName = Albert, LastName = Novak, Salary = 1930 } User { FirstName = Lucy, LastName = Novak, Salary = 670 } User { FirstName = Joe, LastName = Draker, Salary = 1190 } User { FirstName = Amy, LastName = Doe, Salary = 1250 } User { FirstName = John, LastName = Doe, Salary = 1230 } User { FirstName = Janet, LastName = Doe, Salary = 980 } User { FirstName = Robin, LastName = Brown, Salary = 2300 }
在本文中,我们使用了C#List集合。
列出所有C#教程。