细说Linq之Aggregate

前言

Linq中有关常见的方法我们已经玩的得心应手,而对于那些少用的却是置若罔闻(夸张了点),但只有在实际应用中绞尽脑汁想出的方法还不如内置的Linq方法来的实际和简洁

之前在Ruby中演示了一段代码来讲述Ruby的神奇,下面我们再来看一下:

sum = 0
i = 0
(1..101).each do|elem|
  sum+=i
  i+=1end
puts sum

是的就是这段代码,求1到100的和,代码的优美和简洁让我惊叹。

通过C#继续引入话题

如果你是有两年工作经验以上的人,当在面试时,面试官给你出这样一道题:请编码求出1到100的和,用两种或两种以上或者更简洁的方法来实现。你是否很快就写出来了呢?我们来看看。

the first way

            var sum = 0;            for (int i = 1; i <= 100; i++)
            {
                sum += i;
            }
            Console.WriteLine(sum);

一气呵成,这可难不倒有过两年工作经验以上的人,牛逼哄哄的。马不停蹄,走你,进行第二种方式。

the second way

        static int Sum()
        {            var sum = 0;            var i = 1;            do
            {

                sum += i;
                i++;
            } while (i <= 100);            return sum;
        }

哦,果然速度,既然都有do while了 ,不是说要两种或两种以上的方式吗,继续来一个。

the third way

        static int Sum()
        {            var sum = 0;            var i = 1;            while (i <= 100)
            {

                sum += i;
                i++;
            } 
            return sum;
        }

好,到此就算完事了,轻轻松松就ok了,面试官一看,继续问你,除了这些还有其他方式吗,你果断说没有,此时面试官说基本上算满意,不好意思,只能给你个及格,你是不是正在纳闷呢?什么情况,你说的两种或两种以上的方法我都已经实现了而且是最简洁的方式啊,而且结果都是对的,会不会觉得面试官是在跟你抬杠呢?。

如果是在此之前我也会这样写,我一直坚信这是在C#中实现1到100的和的唯一方式(当然也可以用do while和while之类的,其实都差不多),此时我们需要想想,面试官的意图是什么,就是为了考你这个,好歹也是工作两年以上的人了,这简直是看不起人嘛,是的确实有点看不起人,作为工作经验比较足的人,你考我这个,没错,正是因为工作经验足才考你这个,但是你却没能体现你的能力。好了,点到为止,我们开始步入正题,此时你有没有发现代码还是有点繁琐,C#简洁的语法跑到哪里去了,让我开始对我最钟情的C#有点不坚定了。

Aggregate

这个就是我们久久未引入的话题,利用它我们完全可以写出如Ruby一样优美的代码,我们来看看是如何求出1到100的和的:

            var list = Enumerable.Range(1, 100);            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(2, 4);            var sum = nums.Aggregate(1, (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!

时间: 2024-10-26 08:02:51

细说Linq之Aggregate的相关文章

Newtonsoft.Json.Linq

var json = "{\"name\":\"ok1\",\"sex\":\"man\"}"; //Newtonsoft.Json.Linq 将json转换成IEnumerable集合对象在遍历 string ids = ((IEnumerable)json).Cast<Newtonsoft.Json.Linq.JObject>(). Aggregate("", (a, i

线程 Z

原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加入的多线程 API,它们可以充分利用多核处理器. 并行 LINQ(Parallel LINQ)或称为 PLINQ Parallel类 任务并行(task parallelism)构造 SpinLock 和 SpinWait 这些 API 可以统称为 PFX(Parallel Framework,并行

C#中的多线程 - 并行编程 z

原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加入的多线程 API,它们可以充分利用多核处理器. 并行 LINQ(Parallel LINQ)或称为 PLINQ Parallel类 任务并行(task parallelism)构造 SpinLock 和 SpinWait 这些 API 可以统称为 PFX(Parallel Framework,并行

04 LINQ中的聚合函数(Aggregate function in LINQ)

试想一下,我们有一个List<int>数组,现在我们想对List中的所有值求和.在没学习LINQ之前我们会轻松的写出下面的代码: static void Main(string[] args) { List<int> array = new List<int>() { 1, 3, 3, 2, 7, 3, 2, 8, 5, 4, 6 }; int sum = 0; foreach (int item in array) { sum += item; } Console.W

LINQ标准查询操作符(三)——Aggregate、Average、Distinct、Except、Intersect、Union、Empty、DefaultIfEmpty、Range、Repeat

本文来自:http://blog.csdn.net/xuejianwu/article/details/6931903 七.聚合操作符 聚合函数将在序列上执行特定的计算,并返回单个值,如计算给定序列平均值.最大值等.共有7种LINQ聚合查询操作符:Aggregate.Average.Count.LongCount.Max.Min和Sum. 1. Aggregate Aggregate操作符对集合值执行自定义聚合运算.例如,需要列出所有产品类别清单,每个类别名称之间用顿号连接.以下的代码演示了这一

细说 Fireasy Entity Linq解析的几个独创之处

Fireasy Entity的linq内核解析是参考自iqtoolkit源码的,作者熟读源码并吸收其博大精深的思想后,结合项目中的一些需求,对它进行了几处改进.      一.逻辑删除标记 做管理系统的开发者可能会习惯于对数据做逻辑删除处理,即将数据打这一个标记,查询的时候将这些数据过滤掉.在Fireasy Entity的元数据定义PropertyMapInfo类中,有IsDeletedKey这样一个属性,表示使用此列作为逻辑删除标记.对应的,在查询数据的时候,需要把这个标记拼到LINQ里去,不

DataTable Group By或运算 Linq Aggregate的使用

class Program { static void Main(string[] args) { DataTable dt = new DataTable(); dt.Columns.Add("Name", typeof(System.String)); dt.Columns.Add("Value", typeof(System.Int32)); dt.Rows.Add("07", 1); dt.Rows.Add("07",

Linq Aggregate的三种用法

int i = 10;            int[] numbers = { 1, 2, 3 };            // 1+2+3 = 6            int a = numbers.Aggregate((prod, n) => prod + n);            // 10+1+2+3 = 16            int b = numbers.Aggregate(i, (prod, n) => prod + n);            // (10+1+

[转]C#综合揭秘——细说多线程(下)

引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用. 而 I/O线程可能容易遭到大家的忽略,其实在开发多线程系统,更应该多留意I/O线程的操作.特别是在ASP.NET开发当中,可能更多人只会留意在客户端使用Ajax或者在服务器端使用UpdatePanel.其实合理使用I/O线程在通讯项目或文件下载时,能尽量降低IIS的压力. 并行编程是Framework4.0中极力