猿教程 Logo

Linq排序运算符:OrderBy&OrderByDescending

排序运算符按照升序或降序排列集合的元素。 LINQ包括以下排序运算符。

排序运算符描述
OrderBy基于指定字段按升序或降序对集合中的元素进行排序。
OrderByDescending基于指定字段按降序对集合进行排序。 仅在方法语法中有效。
ThenBy仅在方法语法中有效。 用于升序排序。
ThenByDescending仅在方法语法中有效。 用于按降序排列的二级排序。
Reverse仅在方法语法中有效。 以相反的顺序排序集合。

OrderBy按升序或降序对集合的值进行排序。 它默认按升序对集合进行排序,因为升序关键字在这里是可选的。 使用降序关键字以降序对收集进行排序。

相关实例:

IList<Student> studentList = new List<Student>() { 
    new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
    new Student() { StudentID = 2, StudentName = "Steve",  Age = 15 } ,
    new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
    new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
    new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
};

var orderByResult = from s in studentList
                   orderby s.StudentName 
                   select s;

var orderByDescendingResult = from s in studentList
                   orderby s.StudentName descending
                   select s;

相关实例:

Dim orderByResult = From s In studentList
                   Order By s.StudentName  
                   Select s

Dim orderByDescendingResult = From s In studentList
                   Order By s.StudentName Descending
                   Select s

上述示例中的orderByResult在执行后将包含以下元素:

运行结果:

Bill 
John 
Ram 
Ron 
Steve

上述示例中的orderByDescendingResult将在执行后包含以下元素:

运行结果:

Steve 
Ron 
Ram 
John 
Bill

方法中的OrderBy语法:

OrderBy扩展方法有两个重载。 第一个重载OrderBy扩展方法接受Func委托类型参数。 因此,您需要传递基于您要对集合进行排序的字段的lambda表达式。

OrderBy的第二个重载方法接受IComparer的对象以及Func委托类型,以使用自定义比较进行排序。

相关实例:

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, 
                                                                 Func<TSource, TKey> keySelector);

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, 
                                                                 Func<TSource, TKey> keySelector, 
                                                                 IComparer<TKey> comparer);

以下示例使用OrderBy扩展方法按studentName的升序对studentList集合进行排序。

相关实例:

IList<Student> studentList = new List<Student>() { 
    new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
    new Student() { StudentID = 2, StudentName = "Steve",  Age = 15 } ,
    new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
    new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
    new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
};

var studentsInAscOrder = studentList.OrderBy(s => s.StudentName);

相关实例:

Dim studentsInAscOrder = studentList.OrderBy(Function(s) s.StudentName)
注意

方法语法不允许decending关键字按降序对集合进行排序。 可以使用OrderByDescending()方法来降序排列。


OrderByDescending:

OrderByDescending按降序对集合进行排序。

OrderByDescending仅对方法语法有效。 它在查询语法中无效,因为查询语法使用如上所示的升序和降序属性。

相关实例:

IList<Student> studentList = new List<Student>() { 
    new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
    new Student() { StudentID = 2, StudentName = "Steve",  Age = 15 } ,
    new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
    new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
    new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
};

var studentsInDescOrder = studentList.OrderByDescending(s => s.StudentName);

相关实例:

Dim studentsInDescOrder = studentList.OrderByDescending(Function(s) s.StudentName)

上述示例中的结果将在执行后包含以下元素。

运行结果:

Steve 
Ron 
Ram 
John 
Bill

请注意,查询语法不支持OrderByDescending。 请改用降序关键字。


多重排序:

您可以对由逗号分隔的多个字段对集合进行排序。 给定的集合将首先基于第一字段排序,然后如果第一字段的值对于两个元素将是相同的,那么它将使用第二字段来排序等等。

相关实例:

IList<Student> studentList = new List<Student>() { 
    new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
    new Student() { StudentID = 2, StudentName = "Steve",  Age = 15 } ,
    new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
    new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
    new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 }, 
    new Student() { StudentID = 6, StudentName = "Ram" , Age = 18 }
};

var orderByResult = from s in studentList
                   orderby s.StudentName, s.Age 
                   select new { s.StudentName, s.Age };

在上面的例子中,studentList集合包括两个相同的StudentNames,Ram。 所以现在,studentList将首先基于StudentName排序,然后按照Age按升序排序。 因此,orderByResult在执行后将包含以下元素

运行结果:

StudentName: Bill, Age: 25 
StudentName: John, Age: 18 
StudentName: Ram, Age: 18 
StudentName: Ram, Age: 20 
StudentName: Ron, Age: 19 
StudentName: Steve, Age: 15
注意

方法语法中的多重排序的工作方式不同。 使用ThenBy或ThenByDecending扩展方法进行二次排序。

要点

LINQ包括五个排序运算符:OrderBy,OrderByDescending,ThenBy,ThenByDescending和Reverse 

LINQ查询语法不支持OrderByDescending,ThenBy,ThenByDescending和Reverse。 它只支持具有“ascending”和“descending”排序方向的“Order By”子句。 

LINQ查询语法支持以逗号分隔的多个排序字段,而您必须使用ThenBy&ThenByDescending方法进行二次排序。

在下一节中了解ThenBy()和ThenByDescending()方法。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Linq/linq-sorting-operators-orderby-orderbydescending.html