细说Linq之Aggregate
admin
2023-07-29 21:20:06
0

通过Ruby引入话题

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

细说Linq之Aggregate

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

细说Linq之Aggregate

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

通过C#继续引入话题 

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

the first way

细说Linq之Aggregate

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

细说Linq之Aggregate

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

the second way

细说Linq之Aggregate

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

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

细说Linq之Aggregate

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

the third way

细说Linq之Aggregate

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

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

细说Linq之Aggregate

好,到此就算完事了,轻轻松松就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("studyfirst", (accmulate, result) => (accmulate.Replace(result, '-')));
            Console.WriteLine(replaceResult);

结果如下:

细说Linq之Aggregate



相关内容

热门资讯

唐驳虎丨250岁的美国,为何还... 作者丨唐驳虎核心提要1. 美国迎来独立250周年国庆,多地举行盛大庆典,特朗普高调宣示“美国再次伟大...
泰山刀片网被质疑影响动物迁徙,... 近日,泰山周边设立135公里刀片铁丝网,引发公众广泛关注。有网友认为此举阻碍野生动物迁徙,对生态环境...
“基本上赶不走”,玉树牧民称牦... 6月30日凌晨,青海玉树某乡一牧民饲养的牦牛被藏马熊袭击咬死。7月4日,当地牧民告诉潇湘晨报晨视频记...
中年男人的“败家三件套”,观鸟... 一种新型成瘾,正在男人中蔓延。他们凌晨四点起床、背着几十斤装备钻进公园和郊野,消失在树丛和芦苇荡中,...
俄乌继续互相发动大规模袭击 据俄罗斯和乌克兰方面消息,当地时间3日晚至4日凌晨,俄乌双方针对对方目标发动大规模袭击。
以色列人质俘虏期间遭医护折磨,... 7 月 4 日消息,2023 年 10 月 7 日以色列音乐节惨案的幸存者玛雅,时隔多年公开讲述了自...
空调遥控器pmv是什么意思 空调遥控器PMV是人体智能舒适系统,是空调的一种模式,在这种模式下空调可以自动调节室内的温度、湿度等...
空调遥控器上的图标都是什么意思 1、三角形符号代表自动模式,空调会根据室内温度高低自动进行制冷或制热工作。2、太阳符号代表制热模式空...
美的空调变频p4是什么故障 变频挂机显示p4是室内主板与显示板通讯故障或除尘复位故障;定速挂机显示p4是过滤网复位故障;定速柜机...
美的空调显示p4是什么故障代码 P4指的是室内蒸发器保护关压缩机,代表美的空调出现了室内蒸发器保护,是因为美的空调的传感器发生了故障...