登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学无止境

一点积累,与大家分享

 
 
 

日志

 
 

精通 LINQ数据访问技术 --排序操作  

2010-07-12 12:22:50|  分类: C#技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

5.4  排序操作

在LINQ中,排序操作可以按照一个或多个关键字对 序列中的元素进行排序。其中,第一个排序关键字为主要关键字,第二个排序关键字为次要关键字。排序操作共包括以下5个操作。

  ● OrderBy操作,根据关键字对序列中的元素按升序排列。

  ● OrderByDescending操作,根据关键字对序列中的元素按将序排列。

  ● ThenBy操作,根据次要关键字对序列中的元素按升序排列。

  ● ThenByDescending操作,根据次要关键字对序列中的元素按降序排列。

  ● Reverse操作,将序列中的元素的顺序进行反转。

5.4.1  按主关键字升序排序操作OrderBy

OrderBy操作根据关键字对序列中的元素按升序 排列。Enumerable类的OrderBy()方法2种原型如下。

(1)public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(

this IEnumerable<TSource> source,Func<TSource, TKey> keySelector)

(2)public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(

this IEnumerable<TSource> source,Func<TSource, TKey> keySelector,IComparer<TKey> comparer)

其中,source参数表示数据 源,keySelector参数表示获取排序键的函数,comparer参数表示排序时的比较函数。TSource指定source参数中的元素的类 型,TKey指定键的类型。

下面的代码实例中的OrderByQuery()函 数演示了OrderBy操作以升序方式排列数据的方法,具体步骤说明如下。

(1)创建整型数组ints,它的值为 “{1,4,2,5,3,6}”。

(2)使用LINQ查询表达式查询ints数组中的 元素,并进行升序排序,结果保存在values变量中。

(3)使用OrderBy操作查询ints数组中的 元素,并进行升序排序,结果保存在valuesOther变量中。

(4)使用foreach语句输出上述查询操作的结 果。

private void OrderByQuery()

         {   ///构建数据源               

                   int[] ints = { 1,4,2,5,3,6 };

                   ///查询数据,倒序排序

                   var values = from i in ints

                                                orderby i

                                                select i;

                   var valuesOther = ints.OrderBy(i => i);

                   ///显示查询结果

                   foreach(var v in values){Response.Write(v + ",");}Response.Write("<br />");

                   foreach(var v in valuesOther){Response.Write(v + ",");}

         }

OrderByQuery()函数执行 OrderBy操作之后的结果和数据源对比如表5.5所示。

表5.5  OrderBy操作前后的数据对比

数据源

查询表达式/操作

查询结果

说明

ints = { 1,4,2,5,3,6 }

from i in ints

orderby i

select i;

values = { 1,2,3,4,5,6 }


ints = { 1,4,2,5,3,6 }

OrderBy(i => i)

valuesOther= { 1,2,3,4,5,6 }


5.4.2  按主关键字倒序排序操作OrderByDescending

OrderByDescending操作根据关键字 对序列中的元素按将序排列。Enumerable类的OrderByDescending()方法的2种原型如下。

(1)public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(

this IEnumerable<TSource> source,Func<TSource, TKey> keySelector)

(2)public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(

this IEnumerable<TSource> source,Func<TSource, TKey> keySelector,IComparer<TKey> comparer)

其中,source参数表示数据 源,keySelector参数表示获取排序键的函数,comparer参数表示排序时的比较函数。TSource指定source参数中的元素的类 型,TKey指定键的类型。

下面的代码实例中的 OrderByDescendingQuery()函数演示了OrderByDescending操作以升序方式排列数据的方法,具体步骤说明如下。

(1)创建整型数组ints,它的值为 “{1,4,2,5,3,6}”。

(2)使用OrderByDescending操作 查询ints数组中的元素,并进行将序排序,结果保存在valuesOther变量中。

(3)使用foreach语句输出上述查询操作的结 果。

         private void OrderByDescendingQuery()

         {   ///构建数据源               

                   int[] ints = { 1,4,2,5,3,6 };

                   ///查询数据,倒序排序       

                   var valuesOther = ints.OrderByDescending(i => i);

                   ///显示查询结果         

                   Response.Write("<br />");

                   foreach(var v in valuesOther)

                   {

                            Response.Write(v + ",");

                   }

         }

OrderByDescendingQuery() 函数执行OrderByDescending之后的结果和数据源对比如表5.6所示。

表5.6  OrderByDescending操作前后的数据对比

数据源

查询表达式/操作

查询结果

说明

ints = { 1,4,2,5,3,6 }

OrderByDescending(i => i)

valuesOther= { 6,5,4,3,2,1 }


5.4.3  按次关键字升序排序操作ThenBy

相对于OrderBy操作而言,OrderBy操作 为主要排序操作,ThenBy操作为次要排序操作。ThenBy操作根据次要关键字对序列中的元素按升序排列。Enumerable类的ThenBy() 方法的2种原型如下。

(1)public static IOrderedEnumerable<TSource> ThenBy<TSource, TKey>(

this IEnumerable<TSource> source,Func<TSource, TKey> keySelector)

(2)public static IOrderedEnumerable<TSource> ThenBy<TSource, TKey>(

this IEnumerable<TSource> source,Func<TSource, TKey> keySelector,IComparer<TKey> comparer)

其中,source参数表示数据 源,keySelector参数表示获取排序键的函数,comparer参数表示排序时的比较函数。TSource指定source参数中的元素的类 型,TKey指定键的类型。

下面的代码实例中的ThenByQuery()函数 演示了ThenBy操作按次要关键字以升序方式排列数据的方法,具体步骤说明如下。

(1)创建数据类型为 List<UserInfo>的数据源users,该数据源包含10个元素。

(2)使用LINQ查询表达式查询users数组中 的元素,并按照“ID”(ID值)和“Username”(用户名称)进行升序排序。其中,ID为排序主关键字,Username为排序次要关键字。排序 之后的结果保存在values变量中。

(3)使用OrderBy和ThenBy操作,并按 照“ID”(ID值)和“Username”(用户名称)进行升序排序。其中,ID为排序主关键字,Username为排序次要关键字。排序之后的结果保 存在valuesOther变量中。

(4)使用foreach语句输出上述查询操作的结 果。

         private void ThenByQuery()

         {   ///构建数据源               

                   List<UserInfo> users = new List<UserInfo>();

                   for(int i = 1; i < 10; i++)

                   {

                            users.Add(new UserInfo(i % 2,"User0" + i.ToString(),"User0" + i.ToString() + "@web.com"));

                   }

                   ///升序排序

                   var values = from u in users

                                               orderby u.ID,u.Username

                                               select u;

                   var valuesOther = users.OrderBy(u => u.ID).ThenBy(u => u.Username);

                   ///显示查询结果

                   foreach(var v in values)

                   {

                            Response.Write("(" + v.ID.ToString() + "," + v.Username + ")</br>");

                   }                 Response.Write("<br />");

                   foreach(var v in valuesOther)

                   {

                            Response.Write("(" + v.ID.ToString() + "," + v.Username + ")</br>");

                   }

         }

ThenBy()函数执行Where操作之后的结果 和数据源对比如表5.7所示。

表5.7  ThenBy操作前后的数据对比

数据源

查询表达式/操作

查询结果

说明

users(包含10个元素,ID属性的值为0或者1,名称为“User00”、“User01”、…、 “User09”)

from u in users

orderby u.ID,u.Username

select u;

values(包含10个元素,ID属性的值为0或者1,名称为“User00”、“User01”、…、 “User09”),先按照ID升序排序,然后再按照Username升序排序。


users(包含10个元素,ID属性的值为0或者1,名称为“User00”、“User01”、…、 “User09”)

OrderBy(u => u.ID).ThenBy(u => u.Username)

valuesOther(包含10个元素,ID属性的值为0或者1,名称为“User00”、“User01”、…、 “User09”),先按照ID升序排序,然后再按照Username升序排序。


5.4.4  按次关键字倒序排序操作ThenByDescending

相对于OrderByDescending操作而 言,OrderByDescending操作为主要排序操作,ThenByDescending操作为次要排序操作。ThenByDescending操 作根据次要关键字对序列中的元素按降序排列。Enumerable类的ThenBy()方法的2种原型如下。

(1)public static IOrderedEnumerable<TSource> ThenByDescending<TSource, TKey>(

this IEnumerable<TSource> source,Func<TSource, TKey> keySelector)

(2)public static IOrderedEnumerable<TSource> ThenByDescending<TSource, TKey>(

this IEnumerable<TSource> source,Func<TSource, TKey> keySelector,IComparer<TKey> comparer)

其中,source参数表示数据 源,keySelector参数表示获取排序键的函数,comparer参数表示排序时的比较函数。TSource指定source参数中的元素的类 型,TKey指定键的类型。

下面的代码实例中的 ThenByDescendingQuery()函数演示了ThenByDescending操作按次要关键字以降序方式排列数据的方法,具体步骤说明如 下。

(1)创建数据类型为 List<UserInfo>的数据源users,该数据源包含10个元素。

(2)使用LINQ查询表达式查询users数组中 的元素,并按照“ID”(ID值)进行升序排序、“Username”(用户名称)进行降序排序。其中,ID为排序主关键字,Username为排序次要 关键字。排序之后的结果保存在values变量中。

(3)使用OrderBy和 ThenByDescending操作,并按照“ID”(ID值)进行升序排序、“Username”(用户名称)进行降序排序。其中,ID为排序主关键 字,Username为排序次要关键字。排序之后的结果保存在valuesOther变量中。

(4)使用foreach语句输出上述查询操作的结 果。

         private void ThenByDescendingQuery()

         {   ///构建数据源               

                   List<UserInfo> users = new List<UserInfo>();

                   for(int i = 1; i < 10; i++)

                   {

                            users.Add(new UserInfo(i % 2,"User0" + i.ToString(),"User0" + i.ToString() + "@web.com"));

                   }

                   ///倒序排序

                   var values = from u in users

                                                orderby u.ID,u.Username descending

                                                select u;

                   var valuesOther = users.OrderBy(u => u.ID).ThenByDescending(u => u.Username);

                   ///显示查询结果

                   foreach(var v in values)

                   {

                            Response.Write("(" + v.ID.ToString() + "," + v.Username + ")</br>");

                   }

                   Response.Write("<br />");

                   foreach(var v in valuesOther)

                   {

                            Response.Write("(" + v.ID.ToString() + "," + v.Username + ")</br>");

                   }

         }

ThenByDescendingQuery()函 数执行ThenByDescending操作之后的结果和数据源对比如表5.8所示。

表5.8  ThenByDescending操作前后的数据对比

数据源

查询表达式/操作

查询结果

说明

users(包含10个元素,ID属性的值为0或者1,名称为“User00”、“User01”、…、 “User09”)

from u in users

orderby u.ID,u.Username descending

select u;

values(包含10个元素,ID属性的值为0或者1,名称为“User00”、“User01”、…、 “User09”),先按照ID升序排序,然后再按照Username降序排序。


users(包含10个元素,ID属性的值为0或者1,名称为“User00”、“User01”、…、 “User09”)

OrderBy(u => u.ID). ThenByDescending(u => u.Username)

valuesOther(包含10个元素,ID属性的值为0或者1,名称为“User00”、“User01”、…、 “User09”),先按照ID升序排序,然后再按照Username降序排序。


5.4.5  顺序反转操作Reverse

Reverse操作能够将序列中的元素的顺序进行反 转。Enumerable类的Reverse()方法的原型如下。

public static IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)

其中,source参数表示数据源,TSource 指定source参数中的元素的类型。

下面的代码实例中的ReverseQuery()函 数演示了Reverse操作筛选数据的方法,具体步骤说明如下。

(1)创建数据类型为 List<UserInfo>的数据源users,该数据源包含9个元素。

(2)使用Reverse操作反转users数据源 中的元素的顺序。

(3)使用foreach语句输出上述反序操作的结 果。

         private void ReverseQuery()

         {   ///构建数据源               

                   List<UserInfo> users = new List<UserInfo>();

                   for(int i = 1; i < 10; i++)

                   {

                            users.Add(new UserInfo(i % 2,"User0" + i.ToString(),"User0" + i.ToString() + "@web.com"));

                   }

                   ///反转序列

                   users.Reverse();

                   ///显示查询结果

                   foreach(var v in users)

                   {

                            Response.Write("(" + v.ID.ToString() + "," + v.Username + ")</br>");

                   }

         }

ReverseQuery()函数执行 Reverse操作之后的结果和数据源对比如表5.9所示。

表5.9  Reverse操作前后的数据对比

数据源

查询表达式/操作

查询结果

说明

users(包含9个元素,分别为1、2、3、4、5、…、9)

Reverse()

values(包含9个元素,分别为9、8、7、6、…、0)


  评论这张
 
阅读(984)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018