弗曼学习法
- 选择一个要学习的知识点
- 设想一下你要向别人传授这个知识点
- 如果传授的过程中出现问题,那就重新回顾这个知识
- 让你的讲解越来越简单易懂。
- 我加的:不断精简传授的过程,整理出必须的要点。记录整个过程,梳理自己的整个学习过程。
参考说明:大量参考了《C#高级编程》第六版.由于水平有限,理解上可能存在错误,如有错误还请谅解和指出!
什么是LINQ
LINQ是指“语言集成查询”,其英文是指“Language Intergrated Query”。在C#中的LINQ主要是指C#支持、实现的一种查询数据语法(及数据查询功能),这种数据查询语法可以的特点是,可以使用相同的语法访问不同的数据类型。
- 当我们说“一个LINQ”的时候,通常是指一个LINQ表达式,一个符合LINQ语法的一个表达式。
对于一个查询,如从一个List<T>集合中找出T的某个属性符合某一条件的所有元素的集合,可以使用List<T>的FindAll方法,或者直接遍历集合进行查询,也可以使用LINQ进行查询。
LINQ的基本语法规范
首先,一个LINQ查询:
var names = new List<string> { "Nic", "Jason", "Linda", "Linus","Nic" };
var query = from p in names
where p == "Nic"
select p;
foreach(var obj in query)
{
Console.WriteLine(obj);//输出两行"Nic"
}
这里的LINQ查询是从names集合中,找出所有等于"Nic"的元素。这里query是一个IEnumerable(在这里,T是string型)型变量,frome p in names是一个from子句,where p == "Nic"是一个where子句,select p是一个select子句,三个子句构成了一个LINQ表达式,一个LINQ表达式返回一个变量赋给query。我们称query是一个查询,或者说query指定了一个LINQ查询。LINQ基本语法规范:
- 预定义关键字:from,where,orderby,join,let,descending和select,group等。
- 表达式构成:必须以from子句开头,以select子句或者group子句结尾,在这两个子句中间,可以使用where,orderby,join,let和from子句。
使用上需要注意的一些知识点:
1.一个LINQ表达式只是定义了一个查询,并未执行具体的查询。
2.具体的查询,需要foreach访问query时才会执行。至于是不是必须用foreach访问才能执行查询,这个不清楚。
拓展语法
编译器会转换LINQ查询(即LINQ表达式),在实际进行查询是调用方法而非LINQ查询(而非执行LINQ表达式)。LINQ为IEnumerable<T>接口提供了各种拓展方法,以便用户可以在实现了该接口的任意集合上使用LINQ查询。
QA
1.LINQ是不是语法糖?使用LINQ相比于自己写遍历查询,LINQ的优势是不是只是便于查询的书写?LINQ本身是不是有什么特别的技术?LINQ的优势是什么?劣势是什么?
2.LINQ表达式调试时,如何跟进Debug?
A:不太清楚,实际试了一下,调试的时候具体的查询无法断点跟进,会提示“单步请求导致属性或运算符的自动逐过程”,然后直接跳到where子句。
未完待续…