在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)的更多相关文章

  1. MySQL之聚合数据(AVG,COUNT,MAX,MIN,SUM)

    1.首先我们需要了解下什么是聚合函数 聚合函数aggregation function又称为组函数. 认情况下 聚合函数会对当前所在表当做一个组进行统计. 2.聚合函数的特点 1.每个组函数接收一个参 ...

  2. SQL-基础学习4--聚集函数:AVG(),COUNT(),MAX(),MIN(),SUM();聚集不同值:DISTINCT

    第九课 9.1 聚集函数(对某些行运行的函数,计算并返回一个值) 我们经常需要汇总数据而不用把它们实际检索出来,为此SQL提供了专门的函数.使用这些函数,SQL查询可用于检索数据,以便分析和报表生成. ...

  3. sql-函数avg,count,max,min,sum

     常用函数 AVG (平均) COUNT (计数) MAX (最大值) MIN (最小值) SUM (总合) 运用函数的语法是: SELECT "函数名"("栏位名&qu ...

  4. 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 ...

  5. mysql之count,max,min,sum,avg,celing,floor

    写在前面 昨天去青龙峡玩了一天,累的跟狗似的.不过还好,最终也算登到山顶了,也算来北京后征服的第三座山了.这里也唠叨一句,做开发这行,没事还是多运动运动,对自己还是很有好处的,废话少说,还是折腾折腾s ...

  6. SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum

    SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum avg() 函数 定义和用法 AVG 函数返回数值列的平均值.NULL ...

  7. group by与avg(),max(),min(),sum()函数的关系

    数据库表: create table pay_report(     rdate varchar(8),     --日期     region_id varchar(4),    --地市      ...

  8. 49-python基础-python3-列表-常用列表统计函数-max()-min()-sum()

    max() min() sum() 1-数字列表统计 实例: 2-字符串列表统计. 根据ASCII码大小统计字符串列表的min()和max(). 注意:sum()函数无法统计字符串列表. 实例:

  9. MDX Step by Step 读书笔记(七) - Performing Aggregation 聚合函数之 Max, Min, Count , DistinctCount 以及其它 TopCount, Generate

    MDX 中最大值和最小值 MDX 中最大值和最小值函数的语法和之前看到的 Sum 以及 Aggregate 等聚合函数基本上是一样的: Max( {Set} [, Expression]) Min( ...

随机推荐

  1. Nim教程【十五】【完结】

    模版 模版是Nim语言中的抽象语法树,它是一种简单的替换机制,在编译期被处理 这个特性使Nim语言可以和C语言很好的运行在一起 像调用一个方法一样调用一个模版 请看如下代码: template `!= ...

  2. WebDAV 配置及相关工具

    最近在项目中安装和调试服务器,杯具的是,服务器是内网地址,而且不可以直接SSH.SFTP,只能通过中间一台linux作为跳板,然后在SSH命令行里去操作目标机器. 如果只是命令行操作也就无所谓了,但是 ...

  3. 【案例分享】SQL job服务连接不到存储引擎

    在SQL Server agent的日志中发现有大量错误的信息,都是关于作业执行失败的日志 从日志的内容来看,是作业执行过程中无法连接到存储引擎, 可奇怪的是,存储引擎就是本机,而且已经正常启动了,截 ...

  4. swagger:The World's Most Popular Framework for APIs.

    swagger官网:http://swagger.io/ swagger ui demo:http://petstore.swagger.io 让API文档总是与API定义同步更新,是一件非常有价值的 ...

  5. 爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作

    回到目录 上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除 ...

  6. EF架构~豁出去了,为了IOC,为了扩展,改变以前的IRepository接口

    回到目录 使用了4年的IRepository数据仓储接口,今天要改变了,对于这个数据仓储操作接口,它提倡的是简洁,单纯,就是对数据上下文的操作,而直正的数据上下文本身我们却把它忽略了,在我的IRepo ...

  7. 带你走近AngularJS - 创建自定义指令

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  8. 每天一个linux命令(39):grep 命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  9. redis + 主从 + 持久化 + 分片 + 集群 + spring集成

    Redis是一个基于内存的数据库,其不仅读写速度快,每秒可以执行大约110000的写操作,81000的读取操作,而且其支持存储字符串,哈希结构,链表,集合丰富的数据类型.所以得到很多开发者的青睐.加之 ...

  10. ISO语言代码

    // Language ISO Code Abkhazian ab Afar aa Afrikaans af Albanian sq Amharic am Arabic ar Armenian hy ...