LINQ用法大全

  • 格式:pdf
  • 大小:311.93 KB
  • 文档页数:16
也可以在 Select 中使用匿 Nhomakorabea类型。如:
var books = from book in SampleData.Books select new { Title = book.Title, Publisher = , Author = book.Authors.First().LastName };
处理结果为 8。即有 8 个非字母字符。
可能你也注意到了,在 string 的只能语法提示中没有 IEnumerable<T>的扩展方法。但是, 我们还是可以使用它们。
除了上面提到的数据、泛型 List、泛型字典和字符串以外,其他实现了 IEnumerable<T> 的结合都可以使用 LINQ 来查询。对于实现了非泛型的 IEnumerable 集合,如:DataSet 和 ArrayList 等,我们也可以使用 LINQ 查询,但是需要做一些特殊处理。后面将会提到。
var evenNumbers = from item in frenchNumbers where item.Key % 2 == 0 select item.Value;
处理结果为:
Zero deux quatre
字符串 通常,字符串并不当成一个集合。但实际上.NET 的字符串实现了 IEnumerable<Char>接
泛型 List 在.NET 中使用最为广泛的集合无疑是泛型的 List。泛型的 List 包括:
System.Collections.Generic.List<T> System.Collections.Generic.LinkedList<T> System.Collections.Generic.Queue<T> System.Collections.Generic.Stack<T> System.Collections.Generic.HashSet<T> System.Collections.ObjectModel.Collection<T> ponentModel.BindingList<T>
下面是执行结果:
Boolean Char Int32 String
此外,还可以为自定义的对象集合使用 LINQ 操作。如下,就是对示例中的 Book 类使用 LINQ 操作。
Book[] books = { };
new Book{Title = "LINQ in Action"}, new Book{Title = "LINQ for Fun"}, new Book{Title = "Extreme LINQ"}
};
var titles = books .Where(book => book.Title.Contains("Action")) .Select(book => book.Title);
输出的结果和上面的一样,是” LINQ in Action”。
泛型字典 另外一个可以使用 LINQ 操作的常用集合是泛型字典(Generical Dictionary)。.NET
var authors = SampleData.Books.SelectMany(book => book.Authors);
这就大大的简化了代码。实际上,SelectMany 返回的也是一个 IEnumberable<T>的实例。 下面是 SelectMany 的定义:
public static IEnumerable<S> SelectMany<T, S>( this IEnumerable<T> source, Func<T, IEnumerable<S>> selector);
Select Select 用来选择要抽出的字段或者说属性。可以像 SQL 一样取别名等。下面是 Select 扩
展方法的定义:
public static IEnumerable<S> Select<T, S>( this IEnumerable<T> source, Func<T, S> selector);
下面的示例从 Books 中选择出所有 Book 的标题:
var books = SampleData.Books.Select(book => book.Title);
对应的 LINQ 表达式写法为:
var books = from book in SampleData.Books select book.Title;
注意粗体部分,这也是与 Select 显著不同的地方。表明它的返回仍然是一个 IEnumerable<S>的实例。
在 LINQ 表达式不提供对 SelectMany 的支持,但是可以使用多个 From 语句实现相同的功 能:
var authors = from book in SampleData.Books from author in book.Authors select author.FirstName + " " + stName;
中的泛型字典包括:
System.Collections.Generic.Dictionary<TKey,TValue> System.Collections.Generic.SortedDictionary<TKey, TValue> System.Collections.Generic.SortedList<TKey, TValue>
foreach (var author in authors) {
Console.WriteLine(author.FirstName + " " + stName); } }
很明显,这样的做法不能让人满意。LINQ 的 SelectMany 为我们提供了另一种选择。下面 是 LINQ 操作符的写法:
Arrays 我们可以对任何类型的数据使用 LINQ 查询。包括多种类型的对象组成的集合。如:
Object[] array = { "string", 12, true, 'a' };
var types = array.Select(item => item.GetType().Name) .OrderBy(type => type);
口。因此,我们也可以对字符串使用 LINQ。如:
string strLine = "Non-letter characters in this string: 8"; var NonLetterCount = strLine
.Where(c => !Char.IsLetter(c)) .Count();
public static IEnumerable<T> Where<T>( this IEnumerable<T> source, Func<T, bool> predicate);
例如,可以使用下面的查询列出价格在 15 以上的书:
var books = SampleData.Books.Where(book => book.Price >= 15);
在这里,我们仅对 List<T>举一个简单的例子。其他的泛型 List 由于结构的不同在操作上 可能有所不同。
List<Book> books = new List<Book>{ new Book{Title = "LINQ in Action"}, new Book{Title = "LINQ for Fun"}, new Book{Title = "Extreme LINQ"}
SelectMany 在说明 SelectMany 以前先来看一种情况。从给定的示例数据中我们知道,一个 Book 对象
可能有多个 Author。因此,Book 的 Authors 属性背身就是一个集合。如果我们需要列出所有 Book 的所有 Author 应该怎么做?下面是一种可供选择的方法:
var temp = SampleData.Books.Select(book => book.Authors); foreach (var authors in temp) {
查询内存对象
这一章中主要介绍了使用 LINQ 查询内存对象的一些基本语法。在下一章将会有更高级的用
法介绍。本章中的示例数据是一个简单的出版社信息。这是 图表示了数据模型:
数据文件。下面的
在进入本章以前,有必要了解 LINQ 能够查询哪些内存对象。
能够使用 LINQ 查询的内存对象
不是所有的内存对象都可以使用 LINQ 来查询。正如前面说道的,能够使用 LINQ 查询的内存 对象必须实现了 IEnumerable<T>接口。我们称实现了 IEnumerable<T>接口的内存对象为序 列。因为在使用 LINQ 处理的时候就像是一个工厂按步骤处理原材料一样。所幸的是所有的.NET 泛型集合都实现了 IEnumerable<T>接口。也就是说我们可以对所有的.NET 泛型对象集合使用 LINQ 查询。下面是关于所有这些泛型集合的简单示例。
var titles = books .Where(book => book.Title.Contains("Action")) .Select(book => book.Title);
返回的结果为” LINQ in Action”。