分享

List.Generate强大到看不懂?把这几个例子练一练就行!

 大海_Power 2021-05-22

- 群里有一问 -

通过Power Query生成数据表,一共两列,要求及示例如下:

1、NR列:第1行为1,后每行比上行递增1..7的随机整数

2、NUM列:1..1000之间随机整数

3、生成的行数可按需要输入

- 解法 -

核心就一个函数:List.Generate

let
   n = 10,
   源 = Table.FromRecords(
       List.Generate(
           ()=>[i=1,NR=1,NUM=Number.RoundDown(Number.RandomBetween(1,1000))],
           each [i]<=n,
           each [i=[i]+1,
               NR=[NR]+Number.RoundDown(Number.RandomBetween(1,7)),
               NUM=Number.RoundDown(Number.RandomBetween(1,1000))],
           each [[NR],[NUM]]
       )
   )
in
   源

- 这个函数很强大 -

- 这个函数很复杂 -

- 这个函数记不住 -

- 但是 -

- 我们可以这样看 -

List.Generate有4个参数,虽然每个参数都是一个函数!但是,这4个函数有很明确的分工:

1、确定起点,即要生成列表的第1个值;

2、设定生成序列的终止条件;

3、下一个值的生成规则/结果;

4、转换成最终输出结果(如果直接用参数3的结果,可以省略)

- 再来2个帮助文档示例 -

- 示例1 -

List.Generate(
   ()=>0,
   each _<10,
   each _+1
)

简单解析:

1、从0开始

2、只要得到的结果小于10

3、那就加1作为结果并直接输出(省略第4个参数)

输出结果:{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }

- 示例2 -

List.Generate(
 ()=>[A=1,B=1],
 each [A]<5,
 each [A=[A]+1,B=[B]+1],
 each [A]+[B]
)

简单解析:

1、给定记录[A=1,B=1]

2、如果得到的结果中A小于5

3、那就A+1,B+1;重点:可以用[A]或[B]引用上一结果中的值

4、按需要调整输出结果为A+B;重点:可以通过[A]或[B]引用到每一个结果的值

输出结果:{ 2, 4, 6, 8 }

- 总结一下 -

       这其实就是一个循环语句,相对复杂的情况下,可以以记录(Record)的方式作为列表的值,因为记录对每个值有明确的字段名称(类似于在循环中定义变量),方便后续的引用和控制。

        同时,我突然想,这个其实跟玩游戏的过程很像:

       如果你暂时没有能用上这个函数,那也不妨先通过这种方式把这个的几个参数先记住,然后再对上面几个例子动手写几次,很快就会得心应手了。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多