我有以下简短的代码,可以简单地计算文本的单词数:
[<EntryPoint>]
let main argv =
let text = File.ReadAllText("gettysburg.txt").ToLower()
Regex.Split(text, "\W+")
|> Seq.groupBy id
|> Seq.map (fun (k, grp) -> (k, grp |> Seq.length))
|> Seq.sortByDescending (fun (w, ln) -> (ln, w))
|> Seq.iter (fun (k, ln) -> printfn "%s\t%i" k ln)
sort 函数首先按出现次数排序,然后按字母顺序排序,两者都是降序。我需要按出现次数降序,然后按字母顺序升序。
使用 LINQ 非常容易使用 OrderByDescending 和 ThenBy。我如何在 F# 中获得相同的结果而不重复使用 LINQ?
谢谢你。
最佳答案
您可以改用 sortBy
并将出现次数设为负数:
|> Seq.sortBy (fun (w, ln) -> (-ln, w))
或者,如果您遇到更复杂的情况,您可以使用使用比较器函数的函数
sortWith
:|> Seq.sortWith (fun (w1, ln1) (w2, ln2) -> compare (ln2, w1) (ln1, w2))
实际上,第一个解决方案是针对您的特定情况的捷径,因为您可以将数字设为负数,但是如果您有更多字段,而不是数字,那么通过使用
sortWith
您可以实现与 OrderBy
... ThenBy
在 Linq 中相同的效果, 通过对元组进行排序并在降序时交换元素。请注意,这两种替代方案都依赖于元组上的 structural comparison。
关于sorting - F# - 如何按降序然后升序对列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33993894/