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( ...
随机推荐
- 【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不 ...
- Silverlight无法启动调试,错误“Unable to start debugging. The Silverlight Developer Runtime is not installed. Please install a matching version.” 解决办法
今天调试Silverlight出现了以下错误: 意思是“无法启动调试,因为Silverlight Developer Runtime没有安装,请安装一个匹配的版本”.但是按Ctrl + F5可以调试运 ...
- [ZigBee] 5、ZigBee基础实验——图文与代码详解定时器1(16位定时器)(长文)
1.定时器1概述 定时器1 是一个支持典型的定时/计数功能的独立16 位定时器,支持输入捕获,输出比较和PWM等功能.定时器有五个独立的捕获/比较通道.每个通道定时器要使用一个I/O 引脚.定时器用于 ...
- [nRF51822] 6、基于nRF51822平台的flash读写研究
前言 本文重点介绍flash的数据存取特性.flash的内存划分.一个简单的存取图片的内存管理方式,以及对flash写前删的时间.删后读的时间.写后读的时间进行测量的一个小实验.目的在于更全面了解fl ...
- IOS UIView 04- 自定义控件
注:本人是翻译过来,并且加上本人的一点见解. 前言 本文将讨论一些自定义视图.控件的诀窍和技巧.我们先概述一下 UIKit 向我们提供的控件,并介绍一些渲染技巧.随后我们会深入到视图和其所有者之间的通 ...
- Constraint1:主键约束,唯一性约束和唯一索引
1,主键约束创建索引 作为Primay Key的列是唯一的,非空的,Sql Server在创建主键约束时,自动为主键列创建一个唯一索引,并且索引列不允许为null. create table dbo. ...
- wangEditor——轻量级web富文本框
提示:最新版wangEditor请参见 http://www.wangeditor.com/ 和 https://github.com/wangfupeng1988/wangEditor 交流 ...
- Android Service小记
Service 是Android 的一种组件,跟线程无关. Service 分两种启动方式 startService()和bindService() 两种都需要在Androidmanifest.xml ...
- Ajax基础知识《一》
对于网站开发人员,一定不会陌生的Ajax技术,本篇就让我们认识一下它,或许在日后的开发过程中我们就可以使用到.Ajax在那方面使用的比较多呢?答案:表单注册,传统的表单注册,有时需要填写大量的信息,当 ...
- 通过js获得选择文件的绝对路径
<form name="thisform" method="get" action="test.jsp" id="thisf ...