Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)
在Linq中有一些这样的操作,根据集合计算某一单一值,比如集合的最大值,最小值,平均值等等。Linq中包含7种操作,这7种操作被称作聚合操作。
1、Count操作,计算序列中元素的个数,或者计算满足一定条件的元素的个数
2、Sum操作,计算序列中所有元素的值的总和
3、Max操作,计算序列中元素的最大值
4、Min操作,计算序列中元素的最小值
5、Average操作,计算序列中所有元素的平均值
6、Aggregate操作,对集合中的元素进行自定义的聚合计算
7、LongCount操作,计算集合中的元素的数量,或者满足一定条件的元素的数量,一般用来计算大型集合中元素的数量
下面我们就来对这些聚合操作来做逐一的分析。
Count操作
Count操作是用来计算序列中元素的数量或者满足一定条件的元素的数量。Count()方法的原型:
public static int Count<TSource>(this IEnumerable<TSource> source);
public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
Count方法有2个原型,第一个只是单独的计算序列中的元素的数量总和,第二个原型有一个委托函数,用来筛选满足一定条件的元素,然后再计算满足条件的数量和。下面我们举个例子来说明:
private void CountQuery()
{
int[] ints = new int[] { ,,,,,, }; var result = ints.Count();
var result2 = ints.Count(x => x > ); Response.Write(result + "</br>"); Response.Write(result2 + "</br>"); }
这个例子中result是计算ints数组的总数量,result计算的是ints中元素值大于4的元素个数。
看看运行结果:

这种求和过程也很简单

Sum操作
Sum操作计算序列中所有元素的和。Sum函数的原型比较多,这里不一一列举。看例子:
private void SumQuery()
{
int[] ints = new int[] { ,,,,,, }; var result = ints.Sum(); Response.Write(result + "</br>"); }
看看结果:
Max操作
Max操作来计算序列中元素的最大值。
private void MaxQuery()
{
int[] ints = new int[] { ,,,,,, }; var result = ints.Max(); Response.Write(result + "</br>"); }

Min操作
Min操作来计算序列中元素的最小值。
private void MinQuery()
{
int[] ints = new int[] { ,,,,,, }; var result = ints.Min(); Response.Write(result + "</br>"); }

Average操作
Average操作是计算序列的所有元素的平均值。
private void AverageQuery()
{
int[] ints = new int[] { ,,,,,, }; var result = ints.Average(); Response.Write(result + "</br>"); }

Aggregate操作
Aggregate操作,上面的一些都比较简单,我们重点来分析一下Aggregate操作。Aggregate操作能够对集合中的元素进行自定义的聚合计算。Aggregate()函数有3种原型:
public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func);
public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func);
public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector);
其中source表示数据源,func表示累加器函数,seed表示累加器的初始值,resultSelector表示转换结果函数。
下面我们用一个详细的例子来分累加是如何操作的。
首先我们创建一个整型数组ints,值是0~99.
使用Aggregate计算ints中的素有元素之和。
private void AggregateQuery()
{
int[] ints = new int[]; for (int i = ; i < ; i++)
{
ints[i]=i;
} var result = ints.Aggregate((a,b) => a+b); Response.Write(result + "</br>"); }
计算结果:
我们看第一个原型的累加过程:

最终就是通过遍历数据源的每一个元素,根据我们传如的累加函数来累加。比如我们累加函数是求所有元素的和,那么累加函数就是func(a,b){a+b},如果求所有元素的乘积,那么累加函数就是func(a,b){a*b}.
参数a,b的意义:a表示当前元素之前的所有数据根据累加函数求得的值,b就是当前元素。
我们看第二个累加原型:
第二个累加原型有一个累加基数seed,就表示在这个seed基础上进行累加。比如上面我们创建的数组是0~99,累加和是4950.那么我给累加seed这个基数设置为100,那么累加和就是4950+100=5050.
private void AggregateQuery()
{
int[] ints = new int[]; for (int i = ; i < ; i++)
{
ints[i]=i;
} var result = ints.Aggregate(,(a,b) => a+b); Response.Write(result + "</br>"); }
看看结果:
看源码分析也确实是这样子的:

第三个原型又多了一个委托函数,这个委托函数是对累加的结果做进一步处理然后返回处理后的结果。我们先看看源码分析:

从累加原型的源码看出,把最终的累加结果又传给resultSelector方法进行进一步处理。
我们看个简单的例子:
private void AggregateQuery()
{
int[] ints = new int[]; for (int i = ; i < ; i++)
{
ints[i]=i;
} var result = ints.Aggregate(,(a,b) => a+b,x=>x*-); Response.Write(result + "</br>"); }
从代码可以看出,我们最终累加的值,然后对它乘以-1返回结果。我们预测应该返回-5050.
看看结果:

看来我们经过源码分析,最终得到了验证,我们的分析是正确的。
LongCount操作
LongCount和Count一样,都是计算序列中元素的数量或者满足一定条件的元素的数量,一般longcount用来计算大型的集合。但是从源代码中我没看到LongCount和Count的计算方法有什么不同,只是计算和的num的声明不同,Count的num声明为int类型,而LongCount的num声明为long类型,数据范围扩大了而已,这里就不再重复讲解了,参考Count即可。
Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)的更多相关文章
- MySQL之聚合数据(AVG,COUNT,MAX,MIN,SUM)
1.首先我们需要了解下什么是聚合函数 聚合函数aggregation function又称为组函数. 认情况下 聚合函数会对当前所在表当做一个组进行统计. 2.聚合函数的特点 1.每个组函数接收一个参 ...
- SQL-基础学习4--聚集函数:AVG(),COUNT(),MAX(),MIN(),SUM();聚集不同值:DISTINCT
第九课 9.1 聚集函数(对某些行运行的函数,计算并返回一个值) 我们经常需要汇总数据而不用把它们实际检索出来,为此SQL提供了专门的函数.使用这些函数,SQL查询可用于检索数据,以便分析和报表生成. ...
- sql-函数avg,count,max,min,sum
常用函数 AVG (平均) COUNT (计数) MAX (最大值) MIN (最小值) SUM (总合) 运用函数的语法是: SELECT "函数名"("栏位名&qu ...
- MySQL之汇总数据(AVG,COUNT,MAX,MIN,SUM)
table test Field Type Null Key Default Extra id int(11) NO PRI NULL auto_increment name char(50) NO ...
- mysql之count,max,min,sum,avg,celing,floor
写在前面 昨天去青龙峡玩了一天,累的跟狗似的.不过还好,最终也算登到山顶了,也算来北京后征服的第三座山了.这里也唠叨一句,做开发这行,没事还是多运动运动,对自己还是很有好处的,废话少说,还是折腾折腾s ...
- SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum avg() 函数 定义和用法 AVG 函数返回数值列的平均值.NULL ...
- group by与avg(),max(),min(),sum()函数的关系
数据库表: create table pay_report( rdate varchar(8), --日期 region_id varchar(4), --地市 ...
- 49-python基础-python3-列表-常用列表统计函数-max()-min()-sum()
max() min() sum() 1-数字列表统计 实例: 2-字符串列表统计. 根据ASCII码大小统计字符串列表的min()和max(). 注意:sum()函数无法统计字符串列表. 实例:
- MDX Step by Step 读书笔记(七) - Performing Aggregation 聚合函数之 Max, Min, Count , DistinctCount 以及其它 TopCount, Generate
MDX 中最大值和最小值 MDX 中最大值和最小值函数的语法和之前看到的 Sum 以及 Aggregate 等聚合函数基本上是一样的: Max( {Set} [, Expression]) Min( ...
随机推荐
- Nim教程【十五】【完结】
模版 模版是Nim语言中的抽象语法树,它是一种简单的替换机制,在编译期被处理 这个特性使Nim语言可以和C语言很好的运行在一起 像调用一个方法一样调用一个模版 请看如下代码: template `!= ...
- WebDAV 配置及相关工具
最近在项目中安装和调试服务器,杯具的是,服务器是内网地址,而且不可以直接SSH.SFTP,只能通过中间一台linux作为跳板,然后在SSH命令行里去操作目标机器. 如果只是命令行操作也就无所谓了,但是 ...
- 【案例分享】SQL job服务连接不到存储引擎
在SQL Server agent的日志中发现有大量错误的信息,都是关于作业执行失败的日志 从日志的内容来看,是作业执行过程中无法连接到存储引擎, 可奇怪的是,存储引擎就是本机,而且已经正常启动了,截 ...
- swagger:The World's Most Popular Framework for APIs.
swagger官网:http://swagger.io/ swagger ui demo:http://petstore.swagger.io 让API文档总是与API定义同步更新,是一件非常有价值的 ...
- 爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作
回到目录 上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除 ...
- EF架构~豁出去了,为了IOC,为了扩展,改变以前的IRepository接口
回到目录 使用了4年的IRepository数据仓储接口,今天要改变了,对于这个数据仓储操作接口,它提倡的是简洁,单纯,就是对数据上下文的操作,而直正的数据上下文本身我们却把它忽略了,在我的IRepo ...
- 带你走近AngularJS - 创建自定义指令
带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...
- 每天一个linux命令(39):grep 命令
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...
- redis + 主从 + 持久化 + 分片 + 集群 + spring集成
Redis是一个基于内存的数据库,其不仅读写速度快,每秒可以执行大约110000的写操作,81000的读取操作,而且其支持存储字符串,哈希结构,链表,集合丰富的数据类型.所以得到很多开发者的青睐.加之 ...
- ISO语言代码
// Language ISO Code Abkhazian ab Afar aa Afrikaans af Albanian sq Amharic am Arabic ar Armenian hy ...