一、概述
LINQ是.NET的一个扩展,是语言集成查询。LINQ查询会发出为对扩展方法和泛型委托的调用,而这些扩展方法和泛型委托都是.NET Framework不可或缺的组成部分。
LINQ查询均开始于关键字from。那么为什么开头的不是像SQL中的select开头呢?这个嘛,我们可以从考虑投影开始。在select子句中,可以定义新类型,并根据源类型元素了解初始化这种新类型的命名属性。如果select在前面的话,当我们使用命名初始化这样的功能来定义一个投影的时候,因为投影的类型在这个时候还是未知的,这就是一个很合理的理由了。
LINQ查询均开始于关键字from。那么为什么开头的不是像SQL中的select开头呢?这个嘛,我们可以从考虑投影开始。在select子句中,可以定义新类型,并根据源类型元素了解初始化这种新类型的命名属性。如果select在前面的话,当我们使用命名初始化这样的功能来定义一个投影的时候,因为投影的类型在这个时候还是未知的,这就是一个很合理的理由了。
二、筛选器
共有两类,一为带有Where子句的传统筛选器;一种为OfType(用于筛选出能够转换为特定类型的值)。
三、限定符
All、Any、Contains,均返回一个布尔值,指示集合中的部分或全部元素是否满足限定符的参数条件。All判断每个成员是否都满足条件。Any指示是否有满足条件的成员。Contains用于查找符合条件的单个元素。
四、Skip和Take实现分区操作
Skip(根据参数跳转到集合的指定位置,并返回该位置后面的每一个元素)、SkipWhile (接受一个谓词而不是一个位置,它将忽略过使谓词为false的元素)、Take(获取序列中指定位置之前的全部元素)以及TakeWhile(获取序列中所有使谓词为true的元素)用于将集合拆分成两个部分并返回其中的一个,这些拆分功能只被实现为扩展方法。
【示例】
using System;
using System.Collections.Generic;
using System.Linq;
namespace 利用Skip和Take实现分区操作
{
class Program
{
static void Main(string[] args)
{
var numbers = new int[] { 1, 42, 3, 4, 5, 23, 8, 19, 23, 56, 9, 12, 24, 36, 33, 6, 66 };
var result1 = numbers.Skip(10);
foreach (var item in result1)
Console.Write(item+" ");
Console.WriteLine();
var result2 = numbers.Take(10);
foreach (var item in result2)
Console.Write(item + " ");
Console.WriteLine();
IEnumerable<int> result3 = numbers.OrderByDescending(i=>i).SkipWhile(i => i > 30);
foreach (var item in result3)
{
Console.Write(item + " ");
}
Console.WriteLine();
var result4 = numbers.OrderByDescending(i=>i).TakeWhile(i => i > 25);
foreach (var item in result4)
{
Console.Write(item + " ");
}
Console.WriteLine();
var result5 = numbers.Skip(10).Take(5);
foreach (var item in result5)
{
Console.Write(item + " ");
}
Console.ReadKey();
}
}
}
五、使用生成运算
生成运算符包括DefaultEmpty、Empty、Range以及Repeat。他们都是实现为扩展方法的。生成运算用于创建新的值序列。
Empty:用于创建指定类型的空集合
Range:用于填充一个新的整数序列。参数:start,count
Repeat:用一个重复值来填充序列
【示例】
using System;
using System.Linq;
namespace 使用生成运算
{
class Program
{
static void Main(string[] args)
{
var empties = Enumerable.DefaultIfEmpty<char>(Enumerable.Empty<char>());
Console.WriteLine("Count: {0}", empties.Count());
var sequence = Enumerable.Range(10, 10);
foreach (var item in sequence)
{
Console.Write(item + " ");
}
var someSStrings = Enumerable.Repeat("weixiaoqi", 20);
Array.ForEach(someSStrings.ToArray(), s => Console.WriteLine(s));
Console.ReadKey();
}
}
}
六、通过Concat串联序列
using System;
using System.Linq;
namespace 通过Concat串联序列
{
class Program
{
static void Main(string[] args)
{
var numbers = new int[] { 1, 2, 3, 4, 5, 6 };
var moreNumbers = new int[] { 7, 8, 9, 10 };
foreach (var n in numbers.Concat(moreNumbers))
{
Console.Write(n + " ");//1,2,3,...,10
}
Console.ReadKey();
}
}
}