神棍 List.Accumulate 2

上题:
file
这个题如何解:
感觉挺复杂的,认识总是从简单到复杂的
我们先来一个简单的,
file

= List.Accumulate(源,{{},0},(x,y)=>if y<>null then {x{0},x{1}+1} else {x{0}&{x{1}},0})

file
什么意思呢就是只要y <>null ,就加一个,相当于统计连续非空 的个数,列表中有三个元素,所以结果是3,if..then 执行了三次
如果y=null 则把结果放到x的第一个参数中,由于列表中没有null 所以if..else后面的代码没有执行.
好了让我们继续,我们给列表最后添加一个null ,这下有好戏看了,if..else 执行了一次,
file
结果变了,在我们的预料之中,if..then 执行了三次,if..else执行了一次
file
让我们继续给列表添加第二个null ,意味什么?if..else将执行二次,
file
结果列表中必须有二个元素:
file
结果列表中有几个元素,意味if..else执行了几次
让我们继续表演,对数据源添加元素:
file
这回我们添加二个元素1,2,我推测,结果列表不会变化,因为后面没有null,if..else无法执行,
file
正在我的预料之中,说明我已经了解了初步的规律
那么我们如何将最后一次的结果放进结果列表中呢,也就是必须让 if..else再执行一次,如果源不变,我们就得想其他的办法了
我们在外面添加一个null,源&{null},即不用改变源,同时又可以达到我们的目的
我们再看看结果
file
非常成功,列表中有三个元素,因为if...else执行了三次
看相已经功德圆满了,
可是我并不满意这个结果,我感觉列表中的0毫无意义
那么有没有什么办法不要0呢?
结果是肯定的:基本思路就是如果y=null 上一次统计的结果为0时,我不希望if...else 执行 ,要实现这个条件,我们必须在else 后面增加一个条件改变if...else 执行if ..then ...else if...then ...else....思路已经完成了,不妨用代码测试一下
file

= List.Accumulate(源&{null},{{},0},(x,y)=>if y<>null then {x{0},x{1}+1} else  if  x{1} =0 then x else {x{0}&{x{1}},0})

这个基本已经?了