细说Linq之Aggregate
前言
Linq中有关常见的方法我们已经玩的得心应手,而对于那些少用的却是置若罔闻(夸张了点),但只有在实际应用中绞尽脑汁想出的方法还不如内置的Linq方法来的实际和简洁,不喜勿喷,怪我见识短。
通过Ruby引入话题
之前在Ruby中演示了一段代码来讲述Ruby的神奇,下面我们再来看一下:
sum = 0
i = 0
(1..101).each do|elem|
sum+=i
i+=1
end
puts sum
是的就是这段代码,求1到100的和,代码的优美和简洁让我惊叹。
通过C#继续引入话题
如果你是有两年工作经验以上的人,当在面试时,面试官给你出这样一道题:请编码求出1到100的和,用两种或两种以上或者更简洁的方法来实现。你是否很快就写出来了呢?我们来看看。
the first way
var sum = ;
for (int i = ; i <= ; i++)
{
sum += i;
}
Console.WriteLine(sum);
一气呵成,这可难不倒有过两年工作经验以上的人,牛逼哄哄的。马不停蹄,走你,进行第二种方式。
the second way
static int Sum()
{
var sum = ;
var i = ;
do
{ sum += i;
i++;
} while (i <= );
return sum;
}
哦,果然速度,既然都有do while了 ,不是说要两种或两种以上的方式吗,继续来一个。
the third way
static int Sum()
{
var sum = ;
var i = ;
while (i <= )
{ sum += i;
i++;
}
return sum;
}
好,到此就算完事了,轻轻松松就ok了,面试官一看,继续问你,除了这些还有其他方式吗,你果断说没有,此时面试官说基本上算满意,不好意思,只能给你个及格,你是不是正在纳闷呢?什么情况,你说的两种或两种以上的方法我都已经实现了而且是最简洁的方式啊,而且结果都是对的,会不会觉得面试官是在跟你抬杠呢?。
如果是在此之前我也会这样写,我一直坚信这是在C#中实现1到100的和的唯一方式(当然也可以用do while和while之类的,其实都差不多),此时我们需要想想,面试官的意图是什么,就是为了考你这个,好歹也是工作两年以上的人了,这简直是看不起人嘛,是的确实有点看不起人,作为工作经验比较足的人,你考我这个,没错,正是因为工作经验足才考你这个,但是你却没能体现你的能力。好了,点到为止,我们开始步入正题,此时你有没有发现代码还是有点繁琐,C#简洁的语法跑到哪里去了,让我开始对我最钟情的C#有点不坚定了。
Aggregate
这个就是我们久久未引入的话题,利用它我们完全可以写出如Ruby一样优美的代码,我们来看看是如何求出1到100的和的:
var list = Enumerable.Range(, );
var result = list.Aggregate((a, b) => (a + b));
Console.WriteLine(string.Format("1到100的和为{0}", result));
就是这么easy,让我眼前一亮,对C#又充满了信心,正如上述而言,作为有工作经验的人,可能这个方法确实没有怎么用过,用的大多数是常见的Linq,当然了那么多Linq哪能全部都会用啊,但是,但是至少得了解这个Linq是做什么的吧(别往心里去,说的没见识的我)。
用法
该Linq字面意思为聚合,例如可用来对集合进行筛选以及上述的求和等等,它有三个重载,它是对列表上的每个元素执行操作,也就是说对第一个和第二个上的元素执行操作,将执行的结果继续携带进行操作。其中有一个重载是种子重载。
种子重载(Seed Overload)
我们求1到5的阶乘。
var nums = Enumerable.Range(, );
var sum = nums.Aggregate(, (a, b) => a * b);
Console.WriteLine(sum);
所谓种子,也就是先从种子开始作为第一个元素执行操作,整个过程为((((1*2)*3)*4)*5)。
结语
本来没怎么接触过Aggregate,在项目中看到别人写到这么一段代码才让我下意识的知道对这个Linq完全没接触过,于是就有这一部分内容。在项目中有这样一个场景:打开对话框上传文件,可以对该文件进行命名,但是我们知道文件名是无法以某些特殊字符命名的如<或者|等等,当文件名为这些时,上传到后台我们会进行替换处理用“-”来进行替换。我们看看代码,例如:
var invalidFileName = Path.GetInvalidFileNameChars();
var replaceResult = invalidFileName.Aggregate("study<Aggregate>first", (accmulate, result) => (accmulate.Replace(result, '-')));
Console.WriteLine(replaceResult);
结果如下:

Aggregate学习完毕,Sleep now!
细说Linq之Aggregate的更多相关文章
- LINQ中Aggregate的用法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- LINQ中的Aggregate用法总结
Aggregate这个语法可以做一些复杂的聚合运算,例如累计求和,累计求乘积.它接受2个参数,一般第一个参数是称为累积数(默认情况下等于第一个值),而第二个代表了下一个值.第一次计算之后,计算的结果会 ...
- Newtonsoft.Json.Linq
var json = "{\"name\":\"ok1\",\"sex\":\"man\"}"; / ...
- Encountered an unexpected error when attempting to resolve tag helper directive '@addTagHelper' with value '"*, Microsoft.AspNet.Mvc.TagHelpers"'
project.json 配置: { "version": "1.0.0-*", "compilationOptions": { " ...
- C#中的多线程 - 并行编程 z
原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加 ...
- 线程 Z
原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加 ...
- Threading in C# 5
Part 5: Parallel Programming In this section, we cover the multithreading APIs new to Framework 4.0 ...
- C#3.0新增功能10 表达式树 05 解释表达式
连载目录 [已更新最新开发文章,点击查看详细] 表达式树中的每个节点将是派生自 Expression 的类的对象. 该设计使得访问表达式树中的所有节点成为相对直接的递归操作. 常规策略是从根节点 ...
- C#线程 并行线程
第五部分 并行线程 在本节中,我们将介绍Framework 4.0新增的利用多核处理器的多线程API: 并行LINQ或PLINQ Parallel 类 任务并行性构造 并发集合 自旋锁和自旋等待 ...
随机推荐
- 许愿墙的搭建基于mysql
首先需要两个服务器(也可以用一台,但不推荐) 1服务器用yum安装Apache+php+php-mysql 2服务器用yum安装mysql 1服务器 用yum安装Apache和php+php-mysq ...
- Ncut源码编译错误的解决方法
NCut是一个比较老的开源代码了.所以在新的matlab的环境下老出各种bug. 经过自己的各种折腾,总结为一下几点: 1.保证matlab的mex是有C编译器可以用的,具体可以用 mex -setu ...
- Java 集合类的特性
ArrayList: 元素单个,效率高,多用于查询 Vector: 元素单个,线程安全,多用于查询 LinkedList: 元素单个,多用于插入和删除 HashMap: 元素成对,元素可为空 H ...
- Python之路Day15--CSS补充以及JavaScript(一)
一.上节作业问题: 上节作业问题: 1.css重用 <style> 如果整个页面的宽度 > 900px时: { .c{ 共有 } .c1{ 独有 } } .c2{ 独有 } < ...
- Python之路第一课Day6--随堂笔记(面向对象 )
本节内容: 1. 面向对象编程介绍 2. 为什么要用面向对象进行开发? 3. 面向对象的特性:封装.继承.多态 4. 类.方法 一.面向过程 VS 面向对象 1. 编程范式 编程是 程序 员 用 ...
- 手把手教android studio中安装Android Butterknife Zelezny (转)
原文地址:http://blog.csdn.net/xin917480852/article/details/51176524 用来快速生成findViewById() 安装方法: 打开Android ...
- 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRemoteDeviceFind
这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRemoteDeviceFind的使用如下: ...
- 浅谈WEB安全性(前端向)
相信进来的时候你已经看到alert弹窗,显示的是你cookie信息(为配合博客园要求已删除).单纯地在你的客户端弹出信息只是类似于迫使你在自己的房间脱衣服——没人看得到,自然也不算啥恶意行为.那么如果 ...
- Python黑帽编程1.2 基于VS Code构建Python开发环境
Python黑帽编程1.2 基于VS Code构建Python开发环境 0.1 本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Atta ...
- .NET开发笔记(二十三) 谷歌地图下载
关于如何将地球经纬度坐标系统转换成程序中常用到的平面2D坐标系统,网上的文章很多,参考http://www.cnblogs.com/beniao/archive/2010/04/18/1714544. ...