博客
关于我
LINQ之Aggregate
阅读量:311 次
发布时间:2019-03-04

本文共 6555 字,大约阅读时间需要 21 分钟。

Aggregate()

可以对数组或列表中的每个元素执行聚合处理。

在以下代码中,通过lambda表达式描述了将数组中所有元素相加而获得的总值的过程。

using System.Linq;using System.Collections;using System.Collections.Generic;public static class Program{
static void Main( string[] args ) {
int[] numbers = new int[] {
1, 2, 3, 4 }; int total = numbers.Aggregate( ( sum, next ) => sum += next ); System.Console.WriteLine( "numbers:{0}", numbers.Text() ); System.Console.WriteLine( "total :{0}", total ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) {
string text = string.Empty; foreach( var value in i_source ) {
text += string.Format( "[{0}], ", value ); } return text; }} numbers:[1], [2], [3], [4],total :10

Aggregate()令人困惑的部分是如何读取参数指定的过程。让我们看一下。

上面代码Aggregate()中指定( sum, next ) => sum += next的过程。
每个元素都包含在第二个参数中。
在这种情况下,next为1到4不相等的值。
然后,将在处理前一个元素时返回的值加到第一个参数。
尽管它是一个值,但它可以是字符串或类,具体取决于您指定的类型。

sum = 0,next = 1

总和= 1,下一个= 2
总和= 3,下一个= 3
总和= 6,下一个= 4

并且处理完最后一个元素的Aggregate()返回处理后的值。

除了简单地添加之外,您甚至可以按如下所示返回比较值:

using System.Linq;using System.Collections;using System.Collections.Generic;public static class Program{
static void Main( string[] args ) {
int[] numbers = new int[] {
1, 2, 3, 4 }; int maxNumber = numbers.Aggregate( ( max, next ) => max < next ? next : max ); System.Console.WriteLine( "numbers:{0}", numbers.Text() ); System.Console.WriteLine( "max :{0}", maxNumber ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) {
string text = string.Empty; foreach( var value in i_source ) {
text += string.Format( "[{0}], ", value ); } return text; }} numbers:[1], [2], [3], [4],max :4

在以上过程中,描述了返回最大值的过程。在这种情况下Aggregate()参数的流程如下。

max = 0,下一个= 1

最大= 1,下一个= 2
最大= 2,下一个= 3
最大值= 3,下一个= 4

在上面的代码中,Aggregate()调用第一个元素的第一个参数是每种类型的默认值。我们可以直接指定该值。

using System.Linq;using System.Collections;using System.Collections.Generic;public static class Program{
static void Main( string[] args ) {
int[] numbers = new int[] {
1, 2, 3, 4 }; int seed = 15; int total = numbers.Aggregate( seed, ( sum, next ) => sum += next ); System.Console.WriteLine( "numbers:{0}", numbers.Text() ); System.Console.WriteLine( "seed :{0}", seed ); System.Console.WriteLine( "total :{0}", total ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) {
string text = string.Empty; foreach( var value in i_source ) {
text += string.Format( "[{0}], ", value ); } return text; }}numbers:[1], [2], [3], [4],seed :15total :25

在此示例中,我们传递15作为初始值。下面是Aggregate()的流程。

sum = 15, next = 1

sum = 16, next = 2
sum = 18, next = 3
sum = 21, next = 4

该初始值(seed)可以是与调用序列不同的类型。

在这种情况下Aggregate(),返回的类型将与种子值相同。

using System.Linq;using System.Collections;using System.Collections.Generic;public static class Program{
static void Main( string[] args ) {
int[] numbers = new int[] {
1, 2, 3, 4 }; string seed = "0"; string numberText = numbers.Aggregate( seed, ( text, next ) => string.Format( "{0}+{1}", text, next.ToString() ) ); System.Console.WriteLine( "numbers:{0}", numbers.Text() ); System.Console.WriteLine( "seed :{0}", seed ); System.Console.WriteLine( "text :{0}", numberText ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) {
string text = string.Empty; foreach( var value in i_source ) {
text += string.Format( "[{0}], ", value ); } return text; }} numbers:[1], [2], [3], [4],seed :0text :0+1+2+3+4

在上面的示例中,我们将字符串seed传递给int数组。

因此,Aggregate()如果您查看参数流程,它看起来像这样。

text = “0”,next = 1

text = “0+1”,next = 2
text = “0+1+2”,next = 3
text = “0+1+2+3”,next = 4

前面都是对最后一个元素执行处理后的返回值用作返回值。

我们也可以在第三个参数中对最终结果进行处理。

using System.Linq;using System.Collections;using System.Collections.Generic;public static class Program{
static void Main( string[] args ) {
int[] numbers = new int[] {
1, 2, 3, 4 }; int seed = 15; int totalSquare = numbers.Aggregate( seed, ( sum, next ) => sum += next, ( sum ) => sum * sum ); System.Console.WriteLine( "numbers :{0}", numbers.Text() ); System.Console.WriteLine( "seed :{0}", seed ); System.Console.WriteLine( "totalSquare:{0}", totalSquare ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) {
string text = string.Empty; foreach( var value in i_source ) {
text += string.Format( "[{0}], ", value ); } return text; }}numbers :[1], [2], [3], [4],seed :15totalSquare:625

在上面的示例中,流程如下。

seed = 15;
sum = 10 + seed;
sum = 25;
sum*sum = 625;

using System.Linq;using System.Collections;using System.Collections.Generic;public static class Program{
static void Main( string[] args ) {
int[] numbers = new int[] {
1, 2, 3, 4 }; string seed = ""; int number = numbers.Aggregate( seed, ( text, next ) => string.Format( "{0}{1}", text, next.ToString() ), ( text ) => int.Parse( text ) ); System.Console.WriteLine( "numbers:{0}", numbers.Text() ); System.Console.WriteLine( "seed :{0}", seed ); System.Console.WriteLine( "number :{0}", number ); System.Console.ReadKey(); } public static string Text( this IEnumerable i_source ) {
string text = string.Empty; foreach( var value in i_source ) {
text += string.Format( "[{0}], ", value ); } return text; }} numbers:[1], [2], [3], [4],seed :number :1234

在此示例中,描述了将每个元素的数值添加为字符串并最终将字符串转换为数值的过程。

转载地址:http://idnq.baihongyu.com/

你可能感兴趣的文章
NetApp凭借领先的混合云数据与服务把握数字化转型机遇
查看>>
NetBeans IDE8.0需要JDK1.7及以上版本
查看>>
netcat的端口转发功能的实现
查看>>
netfilter应用场景
查看>>
netlink2.6.32内核实现源码
查看>>
Netpas:不一样的SD-WAN+ 保障网络通讯品质
查看>>
NetScaler的常用配置
查看>>
netsh advfirewall
查看>>
NETSH WINSOCK RESET这条命令的含义和作用?
查看>>
Netty WebSocket客户端
查看>>
netty 主要组件+黏包半包+rpc框架+源码透析
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty中集成Protobuf实现Java对象数据传递
查看>>
Netty事件注册机制深入解析
查看>>
Netty原理分析及实战(四)-客户端与服务端双向通信
查看>>
Netty客户端断线重连实现及问题思考
查看>>
Netty工作笔记0006---NIO的Buffer说明
查看>>
Netty工作笔记0007---NIO的三大核心组件关系
查看>>
Netty工作笔记0011---Channel应用案例2
查看>>
Netty工作笔记0013---Channel应用案例4Copy图片
查看>>