List.Generate强大到看不懂?三个案例从简单到高级练起来!

2021-08-31 11:36:25 浏览数 (1)

- 难题 -

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

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

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

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

- 解法 -

核心就一个函数:List.Generate

代码语言:javascript复制
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 -

代码语言:javascript复制
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 -

代码语言:javascript复制
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 }

- 总结一下 -

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

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

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

0 人点赞