C# 标准查询表达式

一、标准查询运算符

1、C#提供了标准查询运算符,例如我想选择专利一系列(pantents)中以年份19开头的专利,可以用如下语句:

            IEnumerable<Patent>  pantentWhere = pantents.Where(pantent => 
                                                                pantent.YearOfPublicaton.StartsWith("19"));

当然,此处的语句只是定义了查询,此时pantentWhere并没有内容,后面Lambda表达式指定的查询并没有执行,只有当遍历pantentWhere集合的时候才开始执行这个查询规则,这是C#中标准查询的“推迟执行”

2、投射

专利类包含了 名字  年份  应用号  发明者 等,如果我想将专利类的集合中 每个专利的类型都变为只包含 名字与年份的类型,那么可以使用select做到,代码如下:

1 var pantentSelect = pantents.Select(
2                 pantent => 
3                 { 
4                     return new 
5                     { 
6                         Title = pantent.Title, 
7                         Year = pantent.YearOfPublicaton 
8                     }; 
9                 });

可以看到,Lambda表达式返回了一个包含 名字与年份的类型。而当遍历pantentSelect时,其投射语句执行,它则是有[(姓名,值),(年份,值)]构成的集合。

3、排序

利用标准查询运算符OrderByDescending 与 ThenByDescending 可以完成多条件的排序,代码如下:

1 IEnumerable<Patent> pantentOrder = pantents.OrderByDescending(pantent => 
2                                                           pantent.YearOfPublicaton).ThenByDescending(
3                                                           pantent => pantent.Title);

可以看到,只用了一个OrderBy,它会获取并且只会获取一个成为KeySelector的参数来排序,例如本例中的YearOfPublicaton。如果要继续按照第二个关键字排序,只能用ThenBy,在OrderBy的基础上执行。而连着使用多个OrderBy只会撤销上一个OrderBy,所以要用ThenBy,而不是继续使用OrderBy。

此处仅仅简单的列出几项,因为如果执行比较复杂的查询与投射,将会产生比较繁琐难懂的代码。因此,C# 3.0中引入了标准查询表达式,一种更类似于SQL语言的

二、标准查询表达式

1、简单示例,下段代码完成的功能是检索出不含有*的单词:

 1 class Program
 2     {
 3         static string[] Keywords = { "*a", "*b", "*c", "*d", "*e", "*f", "a", "b", "c", "d", "e", "f", "g", "h", "i"};
 4         static void Main(string[] args)
 5         {
 6             ShowContextualKeyword1();
 7         }
 8         public static void ShowContextualKeyword1()
 9         {
10             IEnumerable<string> selection = from word in Keywords
11                                             where !word.Contains(*)
12                                             select word;
13             foreach (string s in selection)
14             {
15                 Console.WriteLine(" " + s);
16             }
17         }
18     }

值得详细说一下的是类型推断:select投射回的是word的集合,word的类型是from后面的那个word,从Keywords推断得到。Keywords是一个string的集合,所以word是string类型,因此select投射到的是IEnumerable<string>

 2、改变返回类型。

select不仅可以返回原始类型,也可以返回指定的类型,我个人总结的是 他会返回select后面的变量的集合类型。

如下代码,返回的不是fileName的集合,而是FileInfo的集合:

1   public static void List1(string rootDirectory, string searchPattern)
2         {
3             IEnumerable<FileInfo> files = from fileName in Directory.GetFiles(rootDirectory, searchPattern)
4                                           select new FileInfo(fileName);
5             foreach (FileInfo file in files)
6             {
7                 Console.WriteLine(".{0}({1})",file.Name,file.LastWriteTime);
8             }
9         }

 

C# 标准查询表达式

上一篇:C#复习三(Day 22)


下一篇:FtpService [windows] 配置