在本文中,我们展示了如何使用LINQ查询在C#中对数据进行排序。
语言集成查询(LINQ)是一种特定领域的语言,用于从各种数据源(包括数组、列表、XML文件或数据库)查询数据。
我们可以使用LINQ的Order
、OrderDescending
、OrderBy
和OrderByDescending
方法对数据进行排序。方法不改变原始序列;他们返回一个新的排序序列。
此外,我们可以在LINQ查询表达式中使用orderby
、ascending
和descending
子句。
C#LINQ命令
Order
方法按升序对序列的元素进行排序。
Order<T>(IEnumerable<T>) Order<T>(IEnumerable<T>, IComparer<T>)
第二种方法接受一个IComparer
。
var words = new List<string> { "world", "War", "abbot", "Caesar", "castle", "sky", "den", "forest", "ocean", "water", "falcon", "owl", "rain", "Earth" }; var sorted = words.Order().ToList(); sorted.ForEach(w => Console.WriteLine(w)); Console.WriteLine("-------------------------"); var sorted2 = words.Order(StringComparer.Ordinal).ToList(); sorted2.ForEach(w => Console.WriteLine(w));
我们有一个单词列表。我们按升序对单词进行排序。
var sorted = words.Order().ToList(); sorted.ForEach(w => Console.WriteLine(w));
我们使用Order
对单词进行排序,并将排序后的结果打印到控制台。单词以不区分大小写的方式排序。
var sorted2 = words.Order(StringComparer.Ordinal).ToList(); sorted2.ForEach(w => Console.WriteLine(w));
我们还向重载方法传递了一个字符串比较器。StringComparer.Ordinal
使单词以区分大小写的方式排序。
$ dotnet run abbot Caesar castle den Earth falcon forest ocean owl rain sky War water world ------------------------- Caesar Earth War abbot castle den falcon forest ocean owl rain sky water world
C#LINQOrderDescending
OrderDescending
方法按降序对序列中的元素进行排序。
var vals = new List<int> { 0, -2, 1, -3, 4, 3, 2, 5, 7, -1 }; var sorted = vals.OrderDescending(); Console.WriteLine(string.Join(", ", sorted));
在程序中,我们按降序对整数进行排序。
$ dotnet run 7, 5, 4, 3, 2, 1, 0, -1, -2, -3
C#LINQOrderBy
OrderBy
方法根据键按升序对序列的元素进行排序。
OrderBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>)
该方法接受一个keyselector函数,该函数从一个元素中提取一个键。
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); } record User(string FirstName, string LastName, int Salary);
在示例中,我们首先按姓氏对用户进行排序,然后按工资排序。
var sortedUsers = users.OrderBy(u => u.LastName).ThenBy(u => u.Salary);
我们按姓氏对用户进行排序,然后按工资升序对用户进行排序。lambda形式的keyselector函数提取LastName
属性作为排序键。
$ 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 }
C#LINQOrderByDescending
OrderByDescending
方法按降序对序列中的元素进行排序。
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 descending by last name and salary"); var sortedUsers = users.OrderByDescending(u => u.LastName) .ThenByDescending(u => u.Salary); foreach (var user in sortedUsers) { Console.WriteLine(user); } record User(string FirstName, string LastName, int Salary);
在程序中,我们先按姓氏对用户进行排序,然后按薪水降序排列。
$ dotnet run 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 }
用查询表达式排序
下一个示例使用LINQ查询表达式对数据进行排序。
var words = new List<string> { "world", "War", "abbot", "Caesar", "castle", "sky", "den", "forest", "ocean", "water", "falcon", "owl", "rain", "Earth" }; var sorted = from word in words orderby word select word; Console.WriteLine(string.Join(", ", sorted)); var sorted2 = from word in words orderby word descending select word; Console.WriteLine(string.Join(", ", sorted2));
我们使用orderby
和descending
子句对单词列表进行排序。
$ dotnet run abbot, Caesar, castle, den, Earth, falcon, forest, ocean, owl, rain, sky, War, water, world world, water, War, sky, rain, owl, ocean, forest, falcon, Earth, den, castle, Caesar, abbot
在本文中,我们使用LINQ在C#中对数据进行了排序。
列出所有C#教程。