《C#本质论》读书笔记(15)使用查询表达式的LINQ

Posted 【唐】三三

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《C#本质论》读书笔记(15)使用查询表达式的LINQ相关的知识,希望对你有一定的参考价值。

15.1 查询表达式的概念


简单的查询表达式

  1. private static void ShowContextualKeywords1()  

  2. {  

  3.     IEnumerable<string> selection = from word in Keywords  

  4.                                     where !word.Contains(\'*\')  

  5.                                     select word;  

  6.   

  7.     foreach (string keyword in selection)  

  8.     {  

  9.         Console.Write(" " + keyword);  

  10.     }  

  11. }  

  12.   

  13. private static string[] Keywords = {  

  14.                                        "abstract""add*""alias*""as""ascending*""base",  

  15.                                        "bool""break""by*""byte""case""catch""char",  

  16.                                        "checked""class""const""continue""decimal",  

  17.                                        "default""delegate""descending*""do""double",  

  18.                                        "dynamic*""else""enum""event""equals*",  

  19.                                        "explicit""extern""false""finally""fixed",  

  20.                                        "from*""float""for""foreach""get*""global*",  

  21.                                        "group*""goto""if""implicit""in""int",  

  22.                                        "into*""interface""internal""is""lock""long",  

  23.                                        "join*""let*""namespace""new""null""object",  

  24.                                        "on*""operator""orderby*""out""override",  

  25.                                        "params""partial*""private""protected""public",  

  26.                                        "readonly""ref""remove*""return""sbyte""sealed",  

  27.                                        "select*""set*""short""sizeof""stackalloc",  

  28.                                        "static""string""struct""switch""this""throw",  

  29.                                        "true""try""typeof""uint""ulong""unchecked",  

  30.                                        "unsafe""ushort""using""value*""var*""virtual",  

  31.                                        "void""volatile""where*""while""yield*"  

  32.                                    };  


15.1.1 投射

查询表达式输出是一个 IEnumerbale<T> IQueryable<T>集合。T数据类型是从select或者groupby子句推导。
上例string数据类型是从 select word推导的,因为word是一个字符串。word数据类型是由from子句所指定的IEnumerbale<T>集合的类型参数(这里是Keywords)。由于Keywords是一个string数组,它实现了IEnumerbale<T>,所以word是一个字符串。
表达式查询特定类型集合时,结果允许将数据投射成一个完全不同的类型。
Directory.GetCurrentDirectory()  

  1. public static void Main()  

  2.  {  

  3.      List1(Directory.GetCurrentDirectory(),"*");  

  4.  }  

  5.   

  6.  static void List1(string rootDirectory, string searchPattern)  

  7.  {  

  8.      IEnumerable<FileInfo> files =  

  9.          from fileName in Directory.GetFiles(  

  10.              rootDirectory, searchPattern)  

  11.          select new FileInfo(fileName);  

  12.   

  13.      foreach (FileInfo file in files)  

  14.      {  

  15.          Console.WriteLine(".{0} ({1})",  

  16.              file.Name, file.LastWriteTime);  

  17.      }  

  18.  }  

 

 这里返回的是一个IEnumerable<FileInfo>,而不是System.IO.Directory.GetFiles()返回的IEnumerables<string>数据类型。
 
C#3.0引入匿名类型,很大程度上就是利用像这样的“投射”功能。
  1. var files =    

  2. from fileName in Directory.GetFiles(    

  3.     rootDirectory, searchPattern)    

  4. select new FileInfo(fileName);    



15.1.2 筛选

where子句在垂直方向筛选集合。
  1.     IEnumerable<string> selection = from word in Keywords  

  2.                                     where !word.Contains(\'*\')  

  3.                                     select word;  



15.1.3 排序

在查询表达式中对数据进行排序的是 orderby 子句。
  1. IEnumerable<string> fileNames =  

  2.     from fileName in Directory.GetFiles(  

  3.         rootDirectory, searchPattern)  

  4.     orderby (new FileInfo(fileName)).Length descending,  

  5.         fileName  

  6.     select fileName;  


ascendingdescending是上下文关键字,分别是升序或降序排序。


15.1.4 let子句

下面代码与上面的代码相似。问题是FileInfo要创建两次,分别在orderby 和 select子句中创建。
  1. public static void Main()  

  2. {  

  3.     ListByFileSize2(Directory.GetCurrentDirectory(), "*");  

  4. }  

  5.   

  6. static void ListByFileSize2(  

  7.         string rootDirectory, string searchPattern)  

  8. {  

  9.     IEnumerable<FileInfo> files =  

  10.         from fileName in Directory.GetFiles(  

  11.             rootDirectory, searchPattern)  

  12.         orderby new FileInfo(fileName).Length, fileName  

  13.         select new FileInfo(fileName);  

  14.   

  15.     foreach (FileInfo file in files)  

  16.     {  

  17.         //  As simplification, current directory is  

  18.         以上是关于《C#本质论》读书笔记(15)使用查询表达式的LINQ的主要内容,如果未能解决你的问题,请参考以下文章

    C#本质论读书笔记

    读书笔记 C# Linq查询之group关键字浅析

    《C#本质论》读书笔记(18)多线程处理

    《C#本质论》读书笔记(16)构建自定义集合

    C#温故知新:《C#图解教程》读书笔记系列

    2016-12-30 c#读书笔记