ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:195.35KB ,
资源ID:18053275      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-18053275.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(linq用法大全.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

linq用法大全.docx

1、linq用法大全查询内存对象这一章中主要介绍了使用LINQ查询内存对象的一些基本语法。在下一章将会有更高级的用法介绍。本章中的示例数据是一个简单的出版社信息。这是数据文件。下面的图表示了数据模型:在进入本章以前,有必要了解LINQ能够查询哪些内存对象。能够使用LINQ查询的内存对象不是所有的内存对象都可以使用LINQ来查询。正如前面说道的,能够使用LINQ查询的内存对象必须实现了IEnumerable接口。我们称实现了IEnumerable接口的内存对象为序列。因为在使用LINQ处理的时候就像是一个工厂按步骤处理原材料一样。所幸的是所有的.NET泛型集合都实现了IEnumerable接口。也就

2、是说我们可以对所有的.NET泛型对象集合使用LINQ查询。下面是关于所有这些泛型集合的简单示例。Arrays我们可以对任何类型的数据使用LINQ查询。包括多种类型的对象组成的集合。如: Object array = string, 12, true, a ; var types = array.Select(item = item.GetType().Name) .OrderBy(type = type);下面是执行结果:BooleanCharInt32String此外,还可以为自定义的对象集合使用LINQ操作。如下,就是对示例中的Book类使用LINQ操作。 Book books = new

3、 BookTitle = LINQ in Action, new BookTitle = LINQ for Fun, new BookTitle = Extreme LINQ ; var titles = books .Where(book = book.Title.Contains(Action) .Select(book = book.Title);返回的结果为” LINQ in Action”。由此可见,对于普通的数据,我们可以很方便的使用LINQ来遍历其中的元素。这对于我们在程序中处理数据是很方便的。泛型List在.NET中使用最为广泛的集合无疑是泛型的List。泛型的List包括:

4、System.Collections.Generic.List System.Collections.Generic.LinkedList System.Collections.Generic.Queue System.Collections.Generic.Stack System.Collections.Generic.HashSet System.Collections.ObjectModel.Collection System.ComponentModel.BindingList在这里,我们仅对List举一个简单的例子。其他的泛型List由于结构的不同在操作上可能有所不同。 List

5、books = new List new BookTitle = LINQ in Action, new BookTitle = LINQ for Fun, new BookTitle = Extreme LINQ ; var titles = books .Where(book = book.Title.Contains(Action) .Select(book = book.Title);输出的结果和上面的一样,是” LINQ in Action”。泛型字典另外一个可以使用LINQ操作的常用集合是泛型字典(Generical Dictionary)。.NET中的泛型字典包括: System

6、.Collections.Generic.Dictionary System.Collections.Generic.SortedDictionary System.Collections.Generic.SortedList泛型字典实现了IEnumerableKeyValuePair。KeyValuePair结构中包含了Key和Value的属性。下面是一个简单的示例: Dictionary frenchNumbers = new Dictionary(); frenchNumbers.Add(0, Zero); frenchNumbers.Add(1, un); frenchNumbers.

7、Add(2, deux); frenchNumbers.Add(3, toris); frenchNumbers.Add(4, quatre); var evenNumbers = from item in frenchNumbers where item.Key % 2 = 0 select item.Value;处理结果为:Zerodeuxquatre字符串通常,字符串并不当成一个集合。但实际上.NET的字符串实现了IEnumerable接口。因此,我们也可以对字符串使用LINQ。如: string strLine = Non-letter characters in this strin

8、g: 8; var NonLetterCount = strLine .Where(c = !Char.IsLetter(c) .Count();处理结果为8。即有8个非字母字符。可能你也注意到了,在string的只能语法提示中没有IEnumerable的扩展方法。但是,我们还是可以使用它们。除了上面提到的数据、泛型List、泛型字典和字符串以外,其他实现了IEnumerable的结合都可以使用LINQ来查询。对于实现了非泛型的IEnumerable集合,如:DataSet和ArrayList等,我们也可以使用LINQ查询,但是需要做一些特殊处理。后面将会提到。一些主要的标准查询操作符下面将会

9、介绍一些主要的标准操作符。在书中包含了如何将查询结果绑定到ASP.NET和WinForm。为了不分散注意力,我把这方面的内容虑过了。有兴趣的话可以参考原书。条件操作符whereWhere操作符用来从数据源中过滤满足给定条件的数据。下面是该扩展方法的定义: public static IEnumerable Where( this IEnumerable source, Func predicate);例如,可以使用下面的查询列出价格在15以上的书:var books = SampleData.Books.Where(book = book.Price = 15);使用查询表达式的写法如下,需要

10、注意的是,使用查询表达式的时候必须带一个select语句。 var books = from book in SampleData.Books where book.Price = 15 select book;Where还有一个重载版本,定义如下: public static IEnumerable Where( this IEnumerable source, Func predicate);使用重载版本,我们可以根据index来指定记录。如,下面的查询返回价格在15以上的前两条记录: var books = SampleData.Books.Where( (book, index) =

11、(book.Price = 15) & index 2);使用查询表达式的时候不能使用重载版本(注:个人认为不行。需要确认。)。SelectSelect用来选择要抽出的字段或者说属性。可以像SQL一样取别名等。下面是Select扩展方法的定义: public static IEnumerable Select( this IEnumerable source, Func selector);下面的示例从Books中选择出所有Book的标题:var books = SampleData.Books.Select(book = book.Title);对应的LINQ表达式写法为: var book

12、s = from book in SampleData.Books select book.Title;也可以在Select中使用匿名类型。如: var books = from book in SampleData.Books select new Title = book.Title, Publisher = book.Publisher.Name, Author = book.Authors.First().LastName ;SelectMany在说明SelectMany以前先来看一种情况。从给定的示例数据中我们知道,一个Book对象可能有多个Author。因此,Book的Author

13、s属性背身就是一个集合。如果我们需要列出所有Book的所有Author应该怎么做?下面是一种可供选择的方法: var temp = SampleData.Books.Select(book = book.Authors); foreach (var authors in temp) foreach (var author in authors) Console.WriteLine(author.FirstName + + author.LastName); 很明显,这样的做法不能让人满意。LINQ的SelectMany为我们提供了另一种选择。下面是LINQ操作符的写法:var authors

14、= SampleData.Books.SelectMany(book = book.Authors);这就大大的简化了代码。实际上,SelectMany返回的也是一个IEnumberable的实例。下面是SelectMany的定义: public static IEnumerable SelectMany( this IEnumerable source, FuncT, IEnumerable selector);注意粗体部分,这也是与Select显著不同的地方。表明它的返回仍然是一个IEnumerable的实例。在LINQ表达式不提供对SelectMany的支持,但是可以使用多个From语句

15、实现相同的功能: var authors = from book in SampleData.Books from author in book.Authors select author.FirstName + + author.LastName;相比较下,个人认为使用LINQ表达式更有灵活性。例如,我们需要在列出所有的作者的同时列出书名。使用LINQ操作符就不能实现。但是,使用LINQ表达式就很容易了: var authors = from book in SampleData.Books from author in book.Authors select new Title = boo

16、k.Title, Author = author.FirstName + + author.LastName;另外需要说明一下,Select和SelectMany都支持在LINQ操作符中使用Index。但是在LINQ表达式中还是不能使用。下面是一个例子: var books = SampleData.Books.Select(book, index) = new index, Title = book.Title ) .OrderBy(book = book.Title);Distinct与SQL一样,LINQ也使用Distinct来除去重复数据。只是由于C#是强类型语言,在判断是不是重复的时

17、候需要实现IEquatable接口,通过使用Equals方法来判断是否重复。如果没有实现IEquatable接口,将使用Object.Equals()方法进行比较。所以,我们可以自定义比较方式。有兴趣的话可以查查看。下面的示例是选出所有出过书的作者: var authors = SampleData.Books .SelectMany(book = book.Authors) .Distinct() .Select(author = author.FirstName + + author.LastName);运行结果为:Johnny GoodGraziella SimplegameOctavi

18、o PrinceJeremy LegrandJeremy Prince注意:对于比较,我有点迷惑。一般的情况下我们都没有实现IEquatable接口。所以会使用Object.Equals()方法进行比较。但是,我在自定义对象中重载了Equals函数后视乎仍然没有作用。下面是我定义的Author类:using System;using System.Collections.Generic;using System.Text;namespace LinqInAction.LinqBooks.Common public class Author public String FirstName get

19、; set; public String LastName get; set; public String WebSite get; set; public override bool Equals(object obj) Author objAuthor = (Author)obj; return this.FirstName = objAuthor.FirstName; 然后,再进行查询,结果仍然为:Johnny GoodGraziella SimplegameOctavio PrinceJeremy LegrandJeremy Prince在重载的Equals中,我将FirstName相

20、同的Author判定为相同。但运行结果明显不是我想要的。这个问题有待于进一步研究。这里做个标记。转换操作符使用转化操作符,LINQ可以将一个序列转化为其他的集合。常用的转换操作符有:ToList()、ToArray()和ToDictionary()。在前面我们已经知道,使用转换操作符将会使查询立即执行,并拷贝一个镜像到另外一个集合。这样,但查询的数据源发生改变的时候我们镜像(即,转换后的集合)就不会同步更新。但是,有的时候我们需要使用转换操作。一种通常的情况是当我们在using模块中使用查询的时候,由于退出using的时候已经关闭了数据连接。使得查询就不再有效。因此,常用的做法是在退出usin

21、g模块以前拷贝一份镜像在另外一个集合中,这样我们就可以在using模块以外使用数据了。这里就不再多说。需要特别提一下的是ToDictionary()。从名字可知,它将序列转化为一个Dictionary。因此,我们需要提供一个参数作为KEY值。如下面的代码表示要将序列转化为一个Dictionary,KEY值设为ISBN:var books = SampleData.Books.ToDictionary(book = book.Isbn);需要注意的是,指定的KEY值是不能重复的。因为Dictionary的KEY值就是唯一的。如果指定了一个重复的KEY值将会导致运行时的错误。如下面的示例,Book

22、s的Publisher就是重复的,就不能使用Publisher作为KEY值:var books = SampleData.Books.ToDictionary(book = book.Publisher);聚集操作符通常说的聚集操作符包括: Count:取得集合中的记录数。 Sum:计算数字项目的和(注意是数字项目)。 Min和Max:对集合中的数字项目找出最大值和最小值(注意是数字项目)。下面是他们的使用方法的示例。由于没有什么特别的,因此就不多做描述。只是提醒注意他们的使用方法。下面的使用方法都是合法的。var books = SampleData.Books.ToDictionary(b

23、ook = book.Publisher);var minPrice = SampleData.Books.Min(book = book.Price);var maxPrice = SampleData.Books.Select(book = book.Price).Max();var totalPrice = SampleData.Books.Sum(book = book.Price);var nbCheapBooks = SampleData.Books.Where(book = book.Price 30).Count();OrderBy,ThenBy,OrderByDescendi

24、ng,ThenByDescending与SQL中一样,OrderBy用来对记录进行排序。需要说明的是这里的排序、下面的嵌入查询和连接查询都是在内存中创建一个查询对象的新视图来仅此那个操作。下面是OderBy的一个例子:var result = from book in SampleData.Books orderby book.Publisher.Name, book.Price descending, book.Title select new Publisher = book.Publisher.Name, Price = book.Price, Title = book.Title ;O

25、bjectDumper.Write(result);注意:ObjectDumper是MS在示例代码中提供的方法。上面的代码被编译为IL代码的时候如下:ObjectDumper.Write(SampleData.Books.OrderBy(delegate(Book book) return book.Publisher.Name;).ThenByDescending(delegate(Book book) return book.Price;).ThenBy(delegate(Book book) return book.Title;).Select(delegate(Book book) r

26、eturn new Publisher = book.Publisher.Name, Price = book.Price, Title = book.Title ;);可以看出,当几个OrderBy连接在一起的时候,编译器在编译的时候实际上是按顺序调用对应的扩展方法。另外,在这里你也可以看见LINQ查询是怎么样被延迟执行的。嵌入查询考虑这样的情况,假设需要查询每个出版社及其发行的书的名字。应该怎么做?下面的做法是一个可选的方式: var result = from book in SampleData.Books select new Publisher = book.Publisher.N

27、ame, Book = book.Title ;上面的查询结果如下,可以看见,这并不能给我们一个有层次的、直观的感受:Publisher=FunBooks Book=Funny StoriesPublisher=Joe Publishing Book=LINQ rulesPublisher=Joe Publishing Book=C# on RailsPublisher=Joe Publishing Book=All your base are belong to usPublisher=FunBooks Book=Bonjour mon Amour使用嵌入查询,我们可以这样做: var re

28、sult = from publisher in SampleData.Publishers select new Publisher = publisher.Name, Book = from book in SampleData.Books where book.Publisher.Name = publisher.Name select book.Title ;查询的结果大致如下,注意到I Publisher没有对应的Book。FunBooksFunny StoriesBonjour mon AmourJoe Publishing LINQ rulesC# on RailsAll you

29、r base are belong to usI PublisherGrouping我们可以使用Grouping实现和上面一样的效果。代码如下: var result = from book in SampleData.Books group book by book.Publisher into pubBooks select new Publisher = pubBooks.Key.Name, Book = from pubBook in pubBooks select pubBook.Title, Count = pubBooks.Count() ;执行结果大致如下:FunBooksFunny StoriesBonjour mon Amour2Joe Publishing LINQ rulesC# on RailsAll your base are belong to us3先看看group by into 是怎么工作的。通过使用上面的表达式,所有的属于同一个Publisher的书都会被聚集到一个pubBooks中。pubBoo

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2