如何根据字串长度进行排序

List.Sort是对list进行排序的函数,在函数说明中有如下图的例子:

这个例子说明List.Sort()加上Value.Compare()的组合是可以对以串列元素为自变量的函数结果进行排序,比如可以根据字串长度进行排序。如果我们有串列为{"**", "+++", "&&&&", "\"},需要根据字串长度进行降序排序,可以通过下图的公式解决这个问题:

let
    Source=  
        List.Sort(   
            {"**", "+++", "&&&&", "\"},
            (x,y)=>
                Value.Compare(
                    1/Text.Length(x),
                    1/Text.Length(y)
                )
        ) 
in
    Source

博主说:

以上为螺旋矛盾同学的投稿,在此表示感谢,也非常欢迎其他同学的积极投稿。

有关List.Sort函数,需要两个参数,第二参数类型为可选的any。当一个函数参数为any的时候,灵活性就大大提高,可玩性也非常高。

有但不局限于以下几种用法:

第二参数可以不填,= List.Sort({"**", "+++", "&&&&", "\"}),文本默认按照首字符ASCII码升序排序。

第二参数填固定枚举值,Order.Descending/Order.Ascending,按照指定升序/降序排列,或用0、1替代,= List.Sort({"**", "+++", "&&&&", "\"},1)表示指定按照降序排列。

也可以是一个函数或表达式,比如按照文本长度排序,默认升序,= List.Sort({"**", "+++", "&&&&", "\"},each Text.Length(_)),或者简化为= List.Sort({"**", "+++", "&&&&", "\"},Text.Length)

这是按照文本长度升序,文本越长排名越靠前,如何降序呢?比如可以用1除,分母越大结果越小,排名就越靠后,= List.Sort({"**", "+++", "&&&&", "\"},each 1/Text.Length(_))

或者可以对升序排列的结果嵌套逆序函数,= List.Reverse(List.Sort({"**", "+++", "&&&&", "\"},Text.Length))

再或者直接第二参数填list控制排序方式,= List.Sort({"**", "+++", "&&&&", "\"},{Text.Length,1})

4 Replies to “如何根据字串长度进行排序”

  1. 请问:List.Sort({2, 3, 1}, (x, y) => Value.Compare(1/x, 1/y))
    当中,x,y分别代表什么呢?
    这个句子与List.Sort({2,3,1},each 1/_)应该没有区别吧,为什么要引入两个参数呢?不太理解。

    1. 在这个例子中两种写法没有区别,但是别的情形中可能二元的更适合,三个数取两个进行组合的意思

  2. 请问这个list, 按长短排序后是这样的。有什么方案吗? 谢谢

    RXFUYN
    UHGZHG
    RXFUYN
    EZKHHY
    UZAPIZ
    WMGOQU
    GIHSEU
    XGXSOI
    GOKRZC
    NAZRER
    NAZRERPQOTKL
    NAZRERGIHSEU
    QQGZWUOCLVDZ
    OCLVDZXGXSOI
    WMGOQUFMTUCM
    GIHSEUXYZMIR
    SRKXXFEZKHHY
    SOLSPIPQOTKL
    NAZRERUMVFQW
    UMVFQWPAIPDK
    XYZMIRXYZMIR
    RXFUYNERNCKK
    SOLSPIXGXSOINAZRER
    SRKXXFXGXSOIYHNSBQ
    UZAPIZGIHSEUSIMXQH
    DMZAGVFMTUCMBCVPHS

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注