Aggregate()
可以对数组或列表中的每个元素执行聚合处理。
MSDN
在以下代码中,通过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 :15
total :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 :0
text :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 :15
totalSquare: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
在此示例中,描述了将每个元素的数值添加为字符串并最终将字符串转换为数值的过程。