标准查询运算符 是组成 LINQ 模式的方法。 这些方法中的大多数都做用于序列;其中序列指其类型实现 IEnumerable<T> 接口或 IQueryable<T> 接口的对象。 标准查询运算符提供包括筛选、投影、聚合、排序等在内的查询功能。html
共有两组 LINQ 标准查询运算符,一组做用于类型 IEnumerable<T> 的对象,另外一组做用于类型 IQueryable<T> 的对象。 构成每一个集合的方法分别是 Enumerable 和 Queryable 类的静态成员。这些方法被定义为做为方法运行目标的类型的扩展方法。 这意味着可使用静态方法语法或实例方法语法来调用它们。api
此外,多个标准查询运算符方法做用于那些基于 IEnumerable<T> 或 IQueryable<T> 的类型外的类型。 Enumerable 类型定义了两种这样的方法,这两种方法都做用于类型 IEnumerable 的对象。这些方法(Cast<TResult>(IEnumerable) 和 OfType<TResult>(IEnumerable))均容许在 LINQ 模式中查询非参数化或非泛型集合。 这些方法经过建立一个强类型的对象集合来实现这一点。Queryable 类定义了两种相似的方法 Cast<TResult>(IQueryable) 和 OfType<TResult>(IQueryable),这两种方法都做用于类型 Queryable 的对象。ide
各个标准查询运算符在执行时间上有所不一样,具体状况取决于它们是返回单一值仍是值序列。 返回单一实例值的这些方法(例如 Average 和 Sum)当即执行。 返回序列的方法会延迟查询执行,并返回一个可枚举的对象。优化
对于在内存中集合上运行的方法(即扩展 IEnumerable<T> 的那些方法),返回的可枚举对象将捕获传递到方法的参数。 在枚举该对象时,将使用查询运算符的逻辑,并返回查询结果。ui
与之相反,扩展 IQueryable<T> 的方法不会实现任何查询行为,但会生成一个表示要执行的查询的表达式树。 源 IQueryable<T> 对象执行查询处理。spa
能够在一个查询中将对查询方法的调用连接在一块儿,这就使得查询的复杂性可能会变得不肯定。code
下面的代码示例演示如何使用标准查询运算符来获取有关序列的信息。htm
string sentence = "the quick brown fox jumps over the lazy dog"; // 将字符串拆分为单个单词以建立集合 string[] words = sentence.Split(' '); // 使用查询表达式语法 var query = from word in words group word.ToUpper() by word.Length into gr orderby gr.Key select new { Length = gr.Key, Words = gr }; // 使用基于方法的查询语法。 var query2 = words. GroupBy(w => w.Length, w => w.ToUpper()). Select(g => new { Length = g.Key, Words = g }). OrderBy(o => o.Length); foreach (var obj in query) { Console.WriteLine("Words of length {0}:", obj.Length); foreach (string word in obj.Words) Console.WriteLine(word); } // 输出: // Words of length 3: // THE // FOX // THE // DOG // Words of length 4: // OVER // LAZY // Words of length 5: // QUICK // BROWN // JUMPS
经过建立适合于目标域或技术的特定于域的方法,能够增大标准查询运算符的集合。 也能够用本身的实现来替换标准查询运算符,这些实现提供诸如远程计算、查询转换和优化之类的附加服务。 有关示例,请参见 AsEnumerable。对象
对数据进行排序 (C#)blog