![caec2ca945c9bd40240cbc8d8806e20a.png](https://img-blog.csdnimg.cn/img_convert/caec2ca945c9bd40240cbc8d8806e20a.png)
拼接字符串应该是我们日常开发中最常见的操作了,你可能列出很多种拼接方法,比如用+号、String.Concat()、string.Join()、StringBuilder等。话不多说,直接讲正事。
有个这样的场景,向外部提供API接口,往往要对参数进行验签。服务端收到参数后需要解析出参数数组,并按字段名正序排序后,然后用"&"拼接成字符串后,再进行MD5加密,就得到签名了。假如已经有一个解析好的一个参数数组,现在需要按“&”间隔拼接字符串,经常看到这样的拼接方法(不要笑,也许你也这样写过哟)。代码如下:
![a51fd1a039ee49b1bff9be38bbf63298.png](https://img-blog.csdnimg.cn/img_convert/a51fd1a039ee49b1bff9be38bbf63298.png)
个人感觉这应该最常见的写法了,其实也没什么高深的,我觉得写的人可能不知道string.Join()方法,或者想重复造轮子?但我们写代码要保持KISS原则,在实现功能的前提下,代码越简单越好。改进后代码如下:
![23d296d1596a33668b4279d783df8d15.png](https://img-blog.csdnimg.cn/img_convert/23d296d1596a33668b4279d783df8d15.png)
写到这里,大家可能觉得没啥意思,太简单了,其实我也是这么觉得,哈哈。不过这个小知识点,可以引出Linq中一个扩展方法Aggregate,这个扩展方法比较冷门,它用来实现累加功能。等等,你不知道什么是累加?通俗地说就是从1加到100。这里我们试着用Aggregate来拼接下这个数组。代码如下:
![856e7fe430c8126d0464c42f4112e902.png](https://img-blog.csdnimg.cn/img_convert/856e7fe430c8126d0464c42f4112e902.png)
如果你以前没用过Aggregate这个方法,可能乍一看有点懞,这样是怎么实现的呢?我们F12去看一下它的源码吧,Follow Me。代码如下:
![287d39365273ba96ba8945cc04ed8b7f.png](https://img-blog.csdnimg.cn/img_convert/287d39365273ba96ba8945cc04ed8b7f.png)
这个方法参数有两个,一个是集合,另一个是func委托,然后在方法里面进行循环集合,并调用func对元素进行操作,大家请重点看一下我画箭头的那一行,它是把计算出的结果又当成参数再次传回func,这样就能实现累加的功能了。相信大家已经明白为什么能实现字符串拼接了,其实这里有点像递归的意思。
其实Aggregate用处非常大,如果你项目中有用到递归或累加判断的场景,就可以考虑使用这个方法,毕竟委托是你传进去的,你可以自定义任意规则。如果你还没有看过瘾,我们可以接着再扩展看一下下面的两个例子,都是官网上的,先看第一个,代码如下:
![b778a8316c5cbcc530f9be90e1460211.png](https://img-blog.csdnimg.cn/img_convert/b778a8316c5cbcc530f9be90e1460211.png)
这个例子是用来找出fruits数组中字符串最长的一项,是不是很巧妙。如果不使用Aggregate,自己实现的话,估计要一大堆代码。我们再看下一个例子,代码如下:
![ce0e98ac18b266aad2c926f8755a855d.png](https://img-blog.csdnimg.cn/img_convert/ce0e98ac18b266aad2c926f8755a855d.png)
这个例子是用来找出数组中偶数元数的数量,也非常简单,我懒的解释了。其实用Aggregate的地方都可以使用Where().Sum()这些组合方法来代替,但使用Aggregate更简洁。
又到了激动人心的总结时刻了,其实没什么好说的,因为真的太简单了。只是觉得大家(包括我自己),不能仅仅满足实现功能就完事,不停地探索才更有乐趣。如果你赞同我说的,给我来个赞吧,哈哈。