LINQ简记(3):子句
- int[] Source1 = new int[] { 10, 50, 22, 38, 91, 17 };
- // 筛选出大于20的数字
- var res =
- from n in Source1
- where n > 20
- select n;
- Debug.Write("\n\n大于20的整数有:\n");
- foreach (int x in res)
- {
- Debug.Write(" " + x);
- }
输出的结果为:
- 大于20的整数有:
- 50 22 38 91
复合条件的写法与if等判断语句一致,LINQ遵循C#语法,再看看下面一个例子,从字符串数组中选出以T开头并且长度大于等于3的。
- string[] Source2 = new string[]{
- "Time", "Apple", "Noooooode", "DogDoorDoc", "TikkyOde"
- };
- var res2 =
- from s in Source2
- where s.StartsWith("T") && s.Length >= 3
- select s;
- Debug.Write("\n\n以“T”开头并且长度在3以上的字符串有:\n");
- foreach (string str in res2)
- {
- Debug.Write(" " + str);
- }
输出结果如下:
- 以“T”开头并且长度在3以上的字符串有:
- Time TikkyOde
二、group子句。
这是一个有点儿难度的子句,很多朋友可能搞不清楚它查询后返回的是什么。这样,我们还是用一个例子来说明吧。
首先,声明一个类,包含两个字段:学生姓名和成绩。
- public class Student
- {
- public string Name { get; set; }
- public int Score { get; set; }
- }
接着,我们把学生的名字以首字母进行分组。
- Student[] Source3 = new Student[]{
- new Student{Name="ZhangFeng", Score = 60},
- new Student{ Name = "LiuXiaoShan", Score = 75 },
- new Student{ Name = "LiangWuTai", Score = 80 },
- new Student{ Name = "ZhongNing", Score = 65 },
- new Student{ Name = "FuNan", Score = 71 },
- new Student{ Name = "LanAo", Score = 79 },
- new Student{ Name = "FangTianHao", Score = 88 }
- };
- var res3 =
- from st in Source3
- group st by st.Name[0];
- Debug.Write("\n\n查询结果变量的类型:" + res3.GetType().Name + "\n");
- Debug.Write("\n分别输出各分组的信息:\n");
- foreach (var g in res3)
- {
- Debug.WriteLine("数据类型:" + g.GetType().Name);
- }
调试运行,然后注意查看“输出窗口”中的内容。
- 查询结果变量的类型:GroupedEnumerable`3
- 分别输出各分组的信息:
- 数据类型:Grouping
- 数据类型:Grouping
- 数据类型:Grouping
因此,我们可以得到这样的结果:
1、分组查询返回一个GroupedEnumerable;
2、每个GroupedEnumerable中包含N个Grouping。
我们发现这些类在对象浏览器中找不到,GroupedEnumerable是内部类,但Grouping通过反射也没找着,那它们的结构到底如何?
现在,我们通过断点调试,进一步了解它们。


从截图中我们看到,IGrouping<TKey,TElement>有一个Key属性,其实它就是存储我们用来进行分组的键,怎么理解呢?
回到上面的例子,我们以什么作为分组的依据?对,姓名字段的第一个个字母,其实是Char类型,因此,比如上面的,“Z”就是一个组的键,在这个组里面,都是以Z开头的对象的集合。
我们可以下一个不成文的结论:分组结果中的所谓Key就是我们用于分组所依据的字段或具体的值。
在实现IGrouping<TKey,TElement>的类中,显然会实现GetEnumerator方法,也就是说我们可以把它foreach出来,上图中看到,每个元素(TElement)说白了就是已经被分组的对象,上例中即为Student对象。
而每个组中其实包含Lookup<TKey,TElement>类。
呵呵,有些混乱了,我们可以这样总结:
执行了LINQ分组查询后,得到的所有分组的集合A,而A中的每个成员就是一个组G1、G2……而G1中就是被分到该组的对象O1、O2……可能用一个图来表示会直观一点。

现在,我们把上面的代码改一下。
- foreach (var g in res3)
- {
- Debug.WriteLine(g.Key);
- foreach (var item in g)
- {
- Debug.WriteLine("姓名:" + item.Name);
- Debug.WriteLine("成绩:" + item.Score);
- }
- }
输出结果如下:
- Z
- 姓名:ZhangFeng
- 成绩:60
- 姓名:ZhongNing
- 成绩:65
- L
- 姓名:LiuXiaoShan
- 成绩:75
- 姓名:LiangWuTai
- 成绩:80
- 姓名:LanAo
- 成绩:79
- F
- 姓名:FuNan
- 成绩:71
- 姓名:FangTianHao
- 成绩:88
LINQ简记(3):子句的更多相关文章
- Linq之select子句
在Linq中select子句用来指定查询结果的类型和表现形式.Linq查询要么以select子句结尾,要么以group子句结尾. List<UserBaseInfo> users = ne ...
- linq group by子句
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- linq之join子句
前面我们总结Linq查询子句总共有8个,join子句是我们讲解的最后一个子句.join子句也是相对比较复杂的,所以最后来讲.join子句可以处理两个数据源之间的联系,当然这两个数据源之间必须存在相关联 ...
- linq之let子句
在Linq查询中Let子句可以创建一个新的范围变量,并使用该变量保存表达式的结果. 看下面的例子: private void LetQuery() { List<UserBaseInfo> ...
- linq之into子句
在Linq表达式中,into子句可以创建一个临时标识符,使用该标识符可以存储group.join或select子句的结果. 下面实例中我们用GroupOtherQuery方法来演示group子句对结果 ...
- linq之orderby子句
在Linq查询中,orderby 子句可以对查询结果集进行排序,可以升序也可以降序,排序关键字可以是多个.默认排序方式为升序. 下面的实例代码OrderQuery()中演示了orderby子句对查询的 ...
- Linq之group子句
在Linq查询语句中,group子句主要作用是对查询的结果集进行分组.并返回元素类型为IGrouping<TKey,TElement>的对象序列. 下面我们在代码实例中创建一个GroupQ ...
- linq之where子句
在Linq中,where子句主要是来指定筛选元素的逻辑条件.linq查询中where子句不是必须的,可以不包括where子句,也可以包含多个where子句,where子句中可以包含一个或多个bool类 ...
- Linq专题之Linq查询from子句
Linq查询表达式包含8个常用的子句:from.where.select.join.into.orderby.group.let.我们来看看详细的说明. from: 指定查询操作的 ...
随机推荐
- 避免死锁的银行家算法C++程序实现
本篇博文为追忆以前写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家 ...
- luogu2744 量取牛奶
题目大意 给出一个整数集合$A$,总数$N$,规定一个整数序列$\{a_n\}, \forall i, a_i\in A$满足条件:存在一个正整数序列$\{k_n\}$,使得$\sum_{i=1}^n ...
- 全面解析布局(Grid & Canvas &StackPanel &Wrappanel) 转
写这篇文章前,特意在百度搜索了一下,发现目前网上介绍布局的文章不多,质量也不是很高.拿grid和canvas来讲,这两个布局容器还是有许多小细节值得讲的,如果你不了解的话,开发中经常会遇到一些让人匪夷 ...
- JSP-Runood:JSP 客户端请求
ylbtech-JSP-Runood:JSP 客户端请求 1.返回顶部 1. JSP 客户端请求 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息 ...
- SQL Server 数据字典生成脚本
SELECT sysobjects.name AS 表名称 ,--sysproperties.[value] AS 表说明 ,syscolumns.name AS 字段名称 ,--properties ...
- [Swift通天遁地]五、高级扩展-(6)对基本类型:Int、String、Array、Dictionary、Date的扩展
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 虚拟机下安装VM
Linux(CentOS 7)命令行模式安装VMware Tools 详解 [日期:2017-05-02] 来源:Linux社区 作者:Linux [字体:大 中 小] 本篇文章主要介绍了如何在Li ...
- BZOJ 5277 IQ题orz
思路: 首先我们注意到,对一个序列按分割点分开以后分别冒泡其实就相当于对整个序列进行冒泡.每一个元素都会对复杂度贡献1,除非一个元素两边的分割点都出现了.因此我们可以完全忽略快排的递归过程.只需考虑每 ...
- Scala-基础-数据类型
import junit.framework.TestCase import org.junit.Test import scala.runtime.RichByte //数据类型 class Dem ...
- [ NOIP 1998 ] TG
\(\\\) \(\#A\) 车站 火车从第\(1\)站开出,上车的人数为\(a\),然后到达第\(2\)站,在第\(2\)站有人上.下车,但上.下车的人数相同,因此在第\(2\)站开出时(即在到达第 ...