.NET基础学习(LINQ)

什么是LINQ

  • LINQ(发音为link)代表语言集成查询(Language Integrated Query)
  • 详细见LINQ

匿名类型

第一个成员初始化器是赋值形式,第二个是成员访问表达式,第三个是标示符形式,如下实例所示:

1 string Sex = "男";
2 var person = new { Age = 24, SimpleClass.Name, Sex };
3 Console.WriteLine("{0},Sex{1},Age {2}",person.Name,person.Sex,person.Age);

运行结果:

注意标示符形式和访问表达式必须定义在匿名类型申明之前,Sex是一个局部变量,Name是类SimpleClass的静态字段。

尽管在代码中看不到匿名类型,对象浏览器却能看到。如果编译器遇到了另一个具有相同参数名、相同引用类型名和相同顺序的匿名类型,它会重用这个类型并直接创建新的实例,而不会创建新的匿名类型。

查询语法和方法语法

  • 查询语法(query syntax)是声明形式的,看上去和SQL的语句很相似。查询语法使用查询表达式书写。
  • 方法语法(method syntax)是命令形式,它的使用是标准的方法调用。方法是一组叫做标准查询运算符的方法。
  • 在一个查询中也可以组合以上两种形式。

示例代码如下所示:

 1 var query1 = from n in Enumerable.Range(1, 10)
 2 where n < 8
 3 select n;
 4 Console.Write("查询语法得到结果:");
 5 foreach (var v in query1) Console.Write("{0}\t",v);
 6
 7 var query2 = Enumerable.Range(1, 8).Where(n => n < 8);
 8 Console.WriteLine("");
 9 Console.Write("方法语法得到结果:");
10 foreach (var v in query2) Console.Write("{0}\t", v);
11
12 int count = (from n in Enumerable.Range(1, 10)
13 where n < 8
14 select n).Count();
15 Console.WriteLine("");
16 Console.WriteLine("两种方式的组合:{0}", count);

运行结果:

查询表达式的结构

1、from子句

  • from子句指定了要作为数据源使用的数据集合。它也引入了迭代变量,迭代变量有序表示数据源的每一个元素。
1 int[] arr = { 1, 5, 9, 8, 45, 23, 26, 14, 7, 8, 9 };
2 var query = from n in arr //(n->迭代变量)
3 where n < 10 //使用迭代变量
4 select n; //使用迭代变量
5 foreach (var v in query) Console.Write("{0}\t",v);
6 Console.WriteLine("");

运行结果:

2、join子句

  • LINQ中的join子句和SQL中的join很相似,连接操作接受两个集合然后创建一个临时的对象集合,每个对象包含原始集合对象中的所有字段,使用连接来结合两个或更多个集合中的数据。

示例代码如下:

 1 public class Student
 2  {
 3 public int StID;
 4 public string LastName;
 5  }
 6 public class CourseStudent
 7  {
 8 public string CourseName;
 9 public int StID;
10  }
11
12 CourseStudent[] studentInCourses = new CourseStudent[]{
13 new CourseStudent{CourseName="Art",StID=1},
14 new CourseStudent{CourseName="Art",StID=3},
15 new CourseStudent{CourseName="History",StID=1},
16 new CourseStudent{CourseName="History",StID=2},
17 new CourseStudent{CourseName="Physics",StID=3}
18  };
19 Student[] students = new Student[] {
20 new Student{StID=1,LastName="张三"},
21 new Student{StID=2,LastName="李四"},
22 new Student{StID=3,LastName="王五"}
23  };
24
25 //获取选修2门课以上同学的名字
26 var query = (from s in students
27 join c in studentInCourses on s.StID equals c.StID
28 where (from x in studentInCourses where x.StID==c.StID select x.StID).Count()>1
29 select s.LastName).Distinct();
30 foreach (var v in query) Console.Write("{0}\t",v);
31 Console.WriteLine("");
32 //获取选修历史同学的名字
33 var query1 = from s in students
34 join c in studentInCourses on s.StID equals c.StID
35 where c.CourseName == "History"
36 select s.LastName;
37 foreach (var v in query1) Console.Write("{0}\t", v);

运行结果:

查询主体中的from...let...where片段

  • 可选的from...let...where部分是查询主体的第一部分,可以由任意数量的3个子句来组合--from子句、let子句和where子句。

1、from子句

  • 查询表达式必须从from子句开始,后面跟的是查询主体。主体本身可以从任何数量的其他from子句开始,每一个from子句都指定了一个额外的数据源集合并引入了要在之后运算的迭代变量,所有from子句的语法和含义都是一样的。

示例代码如下:

1 var someInts = from a in Enumerable.Range(1, 5) //必须的第一个from子句
2 from b in Enumerable.Range(6, 5) //查询主体的第一个子句
3 where a < 3 && b < 10
4 select new { a, b, sum = a + b }; //匿名类型对象
5 foreach (var v in someInts) Console.WriteLine(v);

 2、let子句

  • let子句接受一个表达式的运算并把它赋值给一个需要在其他运算中使用的标示符。

示例代码如下:

1 var someInts = from a in Enumerable.Range(1, 5)
2 from b in Enumerable.Range(6, 5)
3 let sum = a + b //在新的变量中保存结果
4 where sum == 12
5 select new { a, b, sum };
6 foreach (var v in someInts) Console.WriteLine(v);

运行结果:

3、where子句

  • where子句根据之后的运算来去除不符合指定条件的项。

示例代码如下:

1 var someInts = from a in Enumerable.Range(1, 5)
2 from b in Enumerable.Range(6, 5)
3 let sum = a + b
4 where sum > 12 //条件一
5 where a==4 //条件二
6 select new { a, b, sum };
7 foreach (var v in someInts) Console.WriteLine(v);

运行结果:

orderby子句

  • orderby子句接受一个表达式并根据表达式依次返回结果项,orderby子句的默认排序是升序,然而我们可以使用ascending和descending关键词显示第设置元素排序为升序或降序,ordery可以有任意多个子句,它们必须用逗号隔开。

示例代码如下:

 1 var persons = new[] { //匿名类型的对象数组
 2 new {Name="张三",Sex="男",Age=32,Address="广东深圳"},
 3 new {Name="李四",Sex="男",Age=26,Address="广东广州"},
 4 new {Name="王五",Sex="女",Age=22,Address="广东深圳"},
 5 new {Name="赵六",Sex="男",Age=33,Address="广东东莞"}
 6  };
 7 var query = from p in persons
 8 orderby p.Age
 9 select p;
10 foreach (var p in query) Console.WriteLine("Name:{0},Sex:{1},Age:{2},Address:{3}", p.Name, p.Sex, p.Age, p.Address);

运行结果:

group by子句

  • group子句把select的对象根据一些标准进行分组。例如,有了前面示例人的数组,程序可以根据它们的所在地进行分组。
  • group by如果项包含在查询结果中,它们就可以根据某个字段的值进行分组。作为分组依据的项叫做键(key);和select子句不同,group子句不从原始的数据源中返回可枚举的可枚举类型,而是返回以枚举已经形成的项的分组的可枚举类型;分组本身是可枚举类型,它们可枚举实际的项。

示例代码如下:

 1 var persons = new[] { //匿名类型的对象数组
 2 new {Name="张三",Sex="男",Age=32,Address="广东深圳"},
 3 new {Name="李四",Sex="男",Age=26,Address="广东广州"},
 4 new {Name="王五",Sex="女",Age=22,Address="广东深圳"},
 5 new {Name="赵六",Sex="男",Age=33,Address="广东东莞"}
 6  };
 7 var query = from p in persons
 8  group p by p.Address;
 9 foreach (var v in query) //枚举分组
10  {
11 Console.WriteLine("{0}",v.Key); //分组键
12 foreach (var t in v) //枚举分组中的项
13  {
14 Console.WriteLine("Name:{0},Sex:{1},Age:{2},Address:{3}", t.Name, t.Sex, t.Age, t.Address);
15  }
16 }

运行结果:

查询延续

  • 查询延续子句可以接受查询的一部分结果并赋予一个名字,从而可以查询的另一部分中使用。

示例代码如下:

1 var somInts = from a in Enumerable.Range(1, 10)
2 join b in Enumerable.Range(5, 10) on a equals b
3 into groupTemp //查询延续
4 from c in groupTemp
5 select c;
6 foreach (var v in somInts) Console.WriteLine(v);

运行结果如下:

使用委托参数和Lambda的示例

public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

示例代码如下:

1 IList<int> list = Enumerable.Range(1, 100).ToList();
2 Func<int, bool> myDel = delegate(int x) { return x % 2 == 1; };//委托匿名方法
3 var countOdd1 = list.Count(myDel);//调用委托
4 var countOdd2 = list.Count(x => x % 2 == 1);//Lambda表达式
5 Console.WriteLine("委托参数得到奇数的个数:{0}",countOdd1);
6 Console.WriteLine("Lambda得到奇数的个数:{0}", countOdd2);

运行结果:

【转载】http://www.cnblogs.com/cmsdn/archive/2012/04/12/2442107.html

时间: 2024-10-18 18:43:45

.NET基础学习(LINQ)的相关文章

[.net 面向对象编程基础] (20) LINQ使用

[.net 面向对象编程基础] (20)  LINQ使用 通过上节LINQ的基础知识的学习,我们可以开始使用LINQ来进行内存数据的查询了,我们上节说了LINQ的定义为:Language Integrated Query(语言集成查询)的简称,它是集成在.NET编程语言中的一种特性. 1.LINQ的构架 从这幅图中,我们可以知道LINQ包括五个部分:LINQ to Objects.LINQ to XML.LINQ to SQL.LINQ to DataSet.LINQ to Entities.

MongoDB实战开发 【零基础学习,附完整Asp.net示例】

MongoDB实战开发 [零基础学习,附完整Asp.net示例] 阅读目录 开始 下载MongoDB,并启动它 在C#使用MongoDB 重构(简化)代码 使用MongoDB的客户端查看数据 使用MongoDB的客户端维护数据 MongoDB提供的C#驱动 MongoDB不支持在查询数据库时使用Join操作 获取MongoDB服务端状态 [目标]:本文将以实战的形式,向您展示如何用C#访问MongoDB,完成常见的数据库操作任务, 同时,也将介绍MongoDB的客户端(命令行工作模式)以及一些基

蓝鸥零基础学习HTML5—html+css基础

蓝鸥零基础学习HTML5-html+css基础 一.课程目标 1.了解前端开发职位:2.掌握常用标签以及语义及用法:3.掌握常用css的特性,掌握基础布局技巧:4.掌握整站规划概念. 二.适用人群 零基础积极学习html5者 三.课程简介 本课程主要讲解了 html+css的基础知识,包括html模板.标签.css基础样式.布局.表格表单.整站等等,是进行前端开发的基础.Html+css是前端开发的基础,大部分前端开发工程都需要从html+css布局开始,html+css的基础非常重要,是前端开

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac

Linux新手入门书籍推荐 鸟哥的linux私房菜-基础学习篇

这本书写的不错.赞~\(≧▽≦)/~ 2017-02-24 下午,我开始在Linux下写第一个.c程序,在终端打印hello world.gcc 源代码文件之后,输出可执行文件,但是 当我输入文件名执行它的时候,却提示我 无法找到命令.于是我找百度,查资料,花了半个小时,终于找到解决方法了, 输入"./filename"即可.... 2017-02-25 我看<基础学习篇>这本书,在P158页下面的例题讲解中找到了昨天下午异常的解析.我就很是感慨,心想:要是早看这本书,半个

Java基础学习——数组初识(1)

Java基础学习--数组初识(1) 1什么是数组 Java中常见的一种数据结构就是数组,数组可以分为一维数组.二维数组和多维数组. 数组是由一组相同的变量组成的数据类型,数组中每个元素具有相同的数据类型,数组中的每个元素都可以用一个统一的数组名和下标来确定. 2 数组的使用 数组的一般使用步骤: 声明数组 分配内存给该数组 下面是一维数组为例: 数据类型  数组名 []: 数组名 = new 数据类型 [数据个数]: 2.1一维数组的声明与赋值 1.数组的声明 int  num [];    

零基础学习 Hadoop 如何下手

想学习hadoop,可是苦于自己没有任何的基础,不知道该如何下手,也不知道自己能不能学会.其实零基础学习hadoop,没有想象的那么困难.曾经我也是一位小白,刚接触到云计算,想过培训,但是培训机构的选择也让我很纠结,就自己开始去摸索学习,现在我把自己的学习思路整理一下,希望对大家有帮助. 首先整体说一下学习过程给大家借鉴: 一.了解hadoop: 这里不具体阐述概念,有兴趣的同学可以自己上网去查.我们知道hadoop,有单机安装,伪分布安装和分布安装.同时hadoop的环境是Linux,所以我们

HTML&CSS基础学习笔记13—无序列表

无序列表 有时我们的工作繁忙,杂事很多,怕忘记,就会把事情一件件列出来,防止忘记. 它们的排列顺序对于我们来说并不重要,可以随意调换,我们将它称为无序列表,HTML里用<ul>标签来表示无序列表,列表里的项目则用<li>标签来表示: 1 2 3 4 5 <ul>     <li></li>     <li></li>     ... </ul> 看一段实例代码: 对于的浏览器显示结果是这样的: 更多内容学习,请