1..net3.5引入LINQ
2.隐式类型本地变量
var myId = 1;
var myName = "aaaaa";
许多LINQ查询返回的序列只有在编译时才能确定其数据类型,显然无法显示的声明变量,此时使用隐式类型。
3.C#LINQ查询操作符是调用System.Linq.Enumerable类中方法的简便方式。这些方法通常都会使用委托作为参数。实际上也就是在使用微软已经定义的大量扩展方法。
4.LINQ经常使用匿名类型在运行时投影新的数据形式。
5.LINQ查询表达式是强类型的。
6.LINQ查询
public void Func1()
{
string[] arrStr = { "aaaa", "bbbb", "ccacc", "d ddd" };
var result = from g in arrStr
where g.Contains("a")
orderby g
select g;
foreach (var item in result)
{
Console.WriteLine(item);
}
}
7.LINQ和扩展方法
虽然当前示例不需要编写任何扩展方法,但实际上,背后却无缝的使用了他们。LINQ表达式可以用来在实现了泛型的IEnumerable<T>接口的数据容器上做迭代操作。
但是System.Array这个类并没有实现IEnumerable<T>接口,却可以使用LINQ进行查询,这里就使用到了扩展方法;通过静态的System.Linq.Enumerable类类型间接的得到了该类型所需要的功能。
8.LINQ延迟执行
LINQ在我们迭代内容之前,他们不会真正进行运算。可以使用Enumerable类型定义的许多扩展方法如ToArray<T>,ToList<T>,来立即执行LINQ,并获取数据的快照。
9.向外部调用者返回LINQ查询结果,返回值的类型,可以使用恰当的IEnumerable<T>或者IEnumerable类型
public IEnumerable<string> Func2()
{
string[] arrStr = { "aaaa", "bbbb", "ccacc", "d ddd" };
var result = from g in arrStr
where g.Contains("a")
orderby g
select g;
return result;
}
10.LINQ查询应用于非泛型集合
LINQ查询操作符是设计用于任何实现了IEnumerable<T>接口的类型的,无论是直接的还是通过扩展方法间接实现的。System.Collections中传统的非泛型容器类,没有相应的这些条件如ArrayList。但是我们可以使用Enumerable.OfType<T>方法来包含在这些非泛型集合里的数据进行迭代操作。当对一个实现了IEnumerable接口的非泛型容器类调用这个成员方法时,只需指定容器项类型,就可以提取一个兼容于Ienumerable<T>的对象。
var myTest = myArrayList.OfType<MyClass8>(); //把ArrayList转换成一个兼容于IEnumerable<T>的类型,这里的myTest就可以进行迭代了。
11.投影新数据类型
var result = from a in listA select new {a.Id,a.Name};
12.维恩图操作
public void Func1()
{
List<string> listA = new List<string> { "aaa", "bbb", "ccc" };
List<string> listB = new List<string> { "aaa", "ddd", "eee" };
var result1 = (from s in listA select s).
Except(from m in listB select m); //返回listA中存在listB中不存在的项
var result2 = (from s in listA select s).
Intersect(from m in listB select m);//返回listA和listB中都有的项
var result3 = (from s in listA select s).
Union(from m in listB select m); //返回listA和listB中成员,相同只返回一次。
var result4 = (from s in listA select s).
Concat(from m in listB select m); //连接两个list,返回所有的项
}
14.LINQ查询的内部表示
在编译时,将所有的C#LINQ操作符都翻译为Enumerable类中的方法的调用。Enumerable的许多方法的原型都是把委托作为参数(如Func<>)。所以完全可使用原始的委托来建立查询。