首页 > 学院 > 开发设计 > 正文

LINQ基础

2019-11-17 02:27:11
字体:
来源:转载
供稿:网友

LINQ基础

以下为《C#图解教程》读书笔记LINQ是直接嵌入C#的强类型查询语言与LINQ相关的特性:隐式类型的本地变量:使用var对象/集合初始化语法:对象初始化语句/对象初始化器/对象初始化表Lamdba表达式:lambda表达式扩展方法//写一个静态类给已知类添加方法,使用时看起来这个类里面本来就有这个方法.匿名类型:匿名类型LiNQ可应用方面:LINQ语法有两种形式语法,两着性能上没区别:举例:假设已定义了一个数组numbers方法语法:var A=numbers.Where(x=>x<20);//这里用到了Lambda查询语法:var A=from n in numbers where n<20 select n;//这里返回了一个对象,这个对象能形容具体的查询步骤,这里并没有进行查询动作查询变量:查询结果一般为一组可枚举的数据或者一个叫做标量的单一值一组可枚举数据:上面的查询语法的A不包含查询结果,相反,编译器会创建能够执行这个查询的代码标量:int count=(from n in numbers where n<20 select n).Count();//这里是查询语句与方法语句的结合count包含的是真实的整数值,它只能通过真实运行查询才能得到查询表达式结构注意事项:
  • 按照一定的顺序出现
  • from子句和select...group子句是必须的
  • 其他语句是可选的
  • select子句在表达式最后
from子句from指定了查询的数据集合,每一个LINQ查询都要以from开始语法:frome type Item in Items//type 是可选的,因为编译器会帮你推断与foreach的区别foreach指定从第一个开始到结束,from之规定集合的每一项都要访问foreach遇到代码就执行主体,from 只是创建可执行查询的后台代码对象jion 联结:使用联结来结合多个集合的数据联结操作接受两个集合然后创建一个临时的对象集合,每一个对象包含原始集合中的所有字段.语法:自我理解:联结就是把join前的集合与jion后的集合合成一个集合,当然要设置一些选择条件还是看代码说话书上:代码示例:
  1.  1 //这个代码声明了两个类 2 //第一个代表学生,每个学生都有学生的名字和ID 3 //第二个代表课程,每个课程类都有学生的ID和课程的名字 4 class PRogram 5 { 6     public class Student 7     { 8         public int StID; 9         public string LastName;10     }11     public class CourseStudent12     {13         public string CourseName;14         public int StID;15     }16     //在全局中创建学生类与课程类17     //课程类与学生类中有一样的ID18     static Student[] students =newStudent[]{19         new Student{StID=1,LastName="Carson"},20         new Student{StID=2,LastName="Klassen"},21         new Student{StID=3,LastName="Fleming"},22     };23     static CourseStudent[] studentsInCourses =new CourseStuden t[]{24         new CourseStudent{CourseName="Art",StID=1},25         new CourseStudent{CourseName="Art",StID=2},26         new CourseStudent{CourseName="History",StID=1},27         new CourseStudent{CourseName="History",StID=3},28         new CourseStudent{CourseName="Physics",StID=3},29     };30     static void Main()31     {32         var query =from s in students//开始查询,在一个集合内查询33                     join c in studentsInCourses on s.StID equals c.StID34                     //而这个集合是,由两个集合的部分组成,上面的意思是:35                     //定义students的迭代变量a36                     //定义studentsInCourses迭代变量c37                     //联结这连个集合中的成员,并生成新的一个集合38                     //联结结果是:把两个集合成员具有相同StID的拿出来组成一个新的集合39                     where c.CourseName=="History"40                     //找出新集合中CourseName== "History"的成员41                     select s.LastName;42                     //把这些成员的LastName返回43         foreach(var q in query)44         Console.WriteLine("Student taking History: {0}", q);45         Console.ReadKey();46     }47 }

联结过程图例:左students右CourseName每次拿去students的元素更CourseName比较比较两者的StID值阴影为联结结果from... let.... where子句from语句每一个from语句都引入一个新的数据源
  1.  1 class Program 2 { 3     static void Main() 4     { 5         var groupA =new[]{3,4,5,6}; 6         var groupB =new[]{6,7,8,9}; 7         var someInts =from a in groupA//必须的第一个from语句 8                     from b in groupB//主句中的from语句 9                     select new{ a, b, sum=a+b };//创建一个匿名类型10         foreach(var a in someInts )11         Console.WriteLine( a );//很神奇,"a=","b="自动写了12     }13 }

let子句接受一个表达式式的运算并且把它复制给一个需要在其他运算中使用的标示符
  1.  1 class Program 2 { 3     static void Main() 4     { 5         var groupA =new[]{3,4,5,6}; 6         var groupB =new[]{6,7,8,9}; 7         var someInts =from a in groupA 8                     from b in groupB 9                     let sum = a + b10                     where sum ==1211                     select new{ a, b, sum };12         foreach(var a in someInts )13         Console.WriteLine( a );14     }15 }

结果:where子句where子句根据之后的运算来去除不符合指点条件的项注意:只要在from...let...where部分中,查询表达式可以是任意个
  1.  1 static void Main() 2 { 3     var groupA =new[]{3,4,5,6}; 4     var groupB =new[]{6,7,8,9}; 5     var someInts =from int a in groupA 6                 from int b in groupB 7                 let sum = a + b 8                 where sum >=11 9                 where a ==410                 select new{ a, b, sum };11     foreach(var a in someInts )12     Console.WriteLine( a );13 }

orderbyorderby子句接受一个表达式并根据表达式按顺序返回结果项表达式通常是字段,但不一定是数值型,也可以是字符串表达式后面能跟(ascending或descending)//可选的,分别用来设置升序或者降序,默认升序
  1.  1 classProgram 2 { 3     static void Main() 4     { 5         var students =new[] 6         { 7             new{LName="Jones",FName="Mary",Age=19,Major="History"}, 8             new{LName="Smith",FName="Bob",Age=20,Major="CompSci"}, 9             new{LName="Fleming",FName="Carol",Age=21,Major="History"}10         };11         var query =from student in students12         orderby student.Age ascending//降序descending13         select student;14         foreach(var s in query)15         {16             Console.WriteLine("{0}, {1}: {2} - {3}",17             s.LName, s.FName, s.Age, s.Major);18         }19         Console.ReadKey();20     }21 }

select...group子句由两个部分组成select...group:select子句和group...by子句select子句select子句指定了所选对象的哪一个部分被选择这个部分可以是:整个数据项数据项的一个字段数据项的几个字段组成的新对象//匿名类型group...bygroup...by子句是可选的,用来指定选择项是如何被分组.group语句吧select的对象根据一些标准进行分组,如果仅仅写了from语句和goup by语句,返回的是IEnumerable<IGrouping<键,值>>
  1.  1 classProgram 2 { 3     static void Main() 4     { 5         var students =new[] 6         { 7             new{LName="Jones",FName="Mary",Age=19,Major="History"}, 8             new{LName="Smith",FName="Bob",Age=20,Major="CompSci"}, 9             new{LName="Fleming",FName="Carol",Age=21,Major="History"}10         };11         var query =from student in students12                    group student by student.Major;13                    //query是返回的是IEnumerable<IGrouping<键,值>>,所以下面不能直接打印14         foreach(var s in query )15         {16             Console.WriteLine("{0}", s.Key);//key是分组键17             foreach(var t in s )18             Console.WriteLine(" {0}, {1}", t.LName, t.FName);19         }20     }21 }

into子句插叙延续子句可以接受查询的一部分结果并赋予新的名字,把它用于其它的查询
  1.  1 classProgram 2 { 3     static void Main() 4     { 5         var groupA =new[]{3,4,5,6}; 6         var groupB =new[]{4,5,6,7}; 7         var someInts =from a in groupA 8                         join b in groupB on a equals b 9
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表