c#编码技巧(十六):Aggregate妙用

Aggregate妙用

我们知道在System.Linq里,我们可以使用FirstOrDefault(),Where()这些一看名字就知道怎么用的方法, 但有一个方法,可能被忽视,有时候却很适合某些场景的,那就是Aggregate方法,那么Aggregate有什么用?它的用法是什么呢?
	Aggregate: 翻译为聚合、总数、合计的意思,也就是该方法是元素间的聚合运算结果。本文从微软提供的三个扩展方法中,一一举例说明用途用法。
string[] names = new string[] { ".word", ".ppt", ".xls", ".xlsx", ".cs" };

//第一个方法:TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func)
//官方解释:对一个序列应用累加器函数
//适用场景:对于一个IEnumerable<TSource>,相邻元素间进行运算,运算结果传递给下一个运算,最终输出一个TSource类型
//示例:将names每个元素用|连结,并合并为一个string
//foreach循环和string.Join也能实现该逻辑,但涉及到前后元素结果计算的场景,Aggregate更合适
string combine = names.Aggregate((last, current) => 
{
    return last + "|" + current;
});
Console.WriteLine(combine); //输出:.word|.ppt|.xls|.xlsx|.cs

//第二个方法:TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func)
//官方解释:对一个序列应用累加器函数。 将指定的种子值用作累加器初始值
//适用场景:相邻元素进行运算,得到一个自定义类型的结果,将结果传递给下一次运算,输出一个自定义类型的最终结果
//示例:相邻元素比较,各取元素的最后一个字符char,输出ASCII值比较大的字符
char maxChar = names.Aggregate('0', (max, current) =>
{   //注意此处current是string类型(对应Func<TAccumulate, TSource, TAccumulate> func的TSource);
    //max是char类型,也就是'0'是什么类型,它就是什么类型
    char lastChar = current.LastOrDefault();
    if (max > lastChar)
        return max;
    else
        return lastChar;
});
Console.WriteLine(maxChar.ToString()); //(按照字母表顺序,x值最大)输出:x


//第三个方法:TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector)
//官方解释:对一个序列应用累加器函数。 将指定的种子值用作累加器的初始值,并使用指定的函数选择结果值
//适用场景:相邻元素进行运算,得到一个自定义类型的结果,将结果传递给下一次运算,运算结果再进行二次处理
//示例:names相邻元素比较,取Length最短的,并输出一句string:最短的文件后缀名是XXX
string shortest = names.Aggregate(".txt", //".txt"即(TAccumulate seed)
    //此处last与元素值类型(TSource)一致,为string;next与".txt"即(TAccumulate seed)类型一致,也为string
    (last, next) => last.Length < next.Length ? last : next,
    final => $"最短的文件后缀名是[{final}]");//final为前面的运算结果
Console.WriteLine(shortest); //输出:最短的文件后缀名是[.cs]
Console.ReadLine();

总结:
Aggregate注重前后两两元素的运算,也可以应用于运算后得到一个自定义类型的结果,并将这个结果投入到下一次运算中。这是它的适用场景。
虽然Foreach循环也能实现,但涉及前后两两元素的运算,Foreach可能需要定义多个变量,Aggregate明显更简洁。至于效率方面的比较,笔者未深入了解。
System.Linq是最常用的类之一,了解其中每个方法的用途用法,是C# coder的必备技能。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值