聚合功能。步骤顺序

时间:2015-04-13 17:02:57

标签: c# algorithm linq

这是一个简单的任务,以及使用聚合函数的解决方案。我对如何使用此函数有一个大概的想法(例如:计算元素总和,乘以数字)。但是,我无法弄清楚此解决方案中的确切步骤顺序。

我们有数组,它包含4个不同的整数值和带有数组索引外观的字符串。

int[] nums = new int[] {1, 2, 3, 4};
string str = "123214";

我们需要计算每个索引的出现次数,乘以相应的值然后将其全部加起来,这样答案就是13。

以下是使用聚合函数的解决方案:

 str.Aggregate(0, (i, c) => i + nums[c - '1']);

此功能执行的步骤顺序是什么?

1 个答案:

答案 0 :(得分:2)

在这种情况下,你可以使用eq 解决。推理:

str.Aggregate(0, (i, c) => i + nums[c - '1'])
= "123214".Aggregate(0,(i,c) => i+nums[c-'1'])
(i := 0, c := '1' => 0+nums['1'-'1'] = 0+nums[0]=0+1 = 1)
= "23214".Aggregate(1, ...)
(i := 1, c := '2' => 1+nums[1]=1+2=3)
= "3214".Aggregate(3, ...)
(i := 3, c:='3' => 3+nums[2]=3+3=6)
= "214".Aggregate(6,...)
(i:=6, c:='2' => 6+nums[1]=6+2=8)
= "14".Aggregate(8,...)
(i:=8,c:='1' => 8+nums[0]=8+1=9)
= "4".Aggregate(9,...)
(i:=9,c:='4' => 9+nums[3]=9+4=13)
= "".Aggregate(13,...)
= 13

我希望这会有所帮助

要真正学到这样的东西我会鼓励你研究函数式编程(寻找 fold ) - 基本上Aggregate中的第一个参数是状态传递,第二个参数是函数获取旧状态和枚举中的下一个元素(在本例中是字符串中的下一个字符)并且具有产生新状态。因此,在您的情况下,状态只是一个数字,您可以通过根据字符的数值(作为索引)将nums数组中的查找与旧状态相加来计算它