如何在F#中对列表进行排序

3

完全的F#新手问题。 如何对LIST数据结构进行排序?

编辑:抱歉,我的数据结构实际上是一个LIST。

也许我应该加上我的代码,因为仅使用“.sort”并没有起作用:

let getDataFromDb (db: MyDB) Id =
Query.query <@ seq { 
    big honking database/FLinq query
    yield  (sec, pm, sr, trade, tradeRec, i, pm_firm, files, lt)
} @> |> List.ofSeq

当我将代码的最后一行改为以下内容时:
} @> |> List.ofSeq.sortBy fst
我得到了以下结果:

错误 1:未定义字段、构造函数或成员“sortBy”

嗯,真是太烦人了。我现在正在尝试这个方法:
|> List.ofSeq |> List.sortBy

但我得到了这个:

错误 1 类型不匹配。期望一个 (Security * RoleContributor * RoleContributor * SuggestedTrade * SuggestedTradeRecommendation * Idea * RoleContributor * SupportingUploadedFile * LargeText) 列表 -> 'a,但给定了一个 ('b -> 'c) -> 'b 列表 -> 'b 列表。类型 '(Security * RoleContributor * RoleContributor * SuggestedTrade * SuggestedTradeRecommendation * Idea * RoleContributor * SupportingUploadedFile * LargeText) 列表' 与类型 ''a -> 'b' 不匹配。


这看起来有点像真正的生产代码。如果是的话,将其放在类似SO的网站上可能违反您公司的政策。 - vlad
是的,我考虑过掩盖它。也许我应该这样做。 - Ramy
尝试 |> List.ofSeq |> List.sortBy - BrokenGlass
关于你的大查询,最好将其移入存储过程中。如果这不是一个选项,那么你可以通过将连接移到相同的缩进级别来减少缩进程度,像这样:http://pastebin.com/shqsaPG9 - Juliet
3个回答

6

Seq.sortBy可以实现排序。

然而,排序意味着您在排序时知道完整序列的键值,因此按定义无法对无限序列使用此功能。

编辑: 列表的等效函数具有相同的名称: List.sortBy

MSDN示例:

let sortedList2 = List.sortBy (fun elem -> abs elem) [1; 4; 8; -2; 5]
printfn "%A" sortedList2

编辑2:

从你提供的新例子中可以看出,你有一个元组列表。现在取决于你想按元组中哪个项目进行搜索。


这个:让第三个元素(_,_,c)= c从这里开始:http://msdn.microsoft.com/en-us/library/dd233200.aspx非常有帮助。 - Ramy

4

正如其他人所说,Seq.sortBy是正确的方法。如果你正在使用FLinq从数据库中读取数据,那么最好将排序作为数据库查询的一部分(包含在<@ .. @>中),以便在SQL服务器上进行排序:

let getDataFromDb (db: MyDB) Id = 
  <@ seq { big honking database/FLinq query 
             yield  (sec, pm, sr, trade, tradeRec, i, pm_firm, files, lt)
     |> Seq.sortBy (fun (_, _, _, _, _, i, _, _, _) -> i) @>
  |> List.ofSeq 

为了让这个更好,你可以返回一个元组,其中包含关键字和所有其他元素作为嵌套元组,例如key, (sec, pm, ..., lt),然后只使用第一个元素进行排序:
 |> Seq.sortBy (fun (k, _) -> k)

我在使用LINQ to Entities时遇到了一些使用元组的问题,但我相信在LINQ to SQL中应该可以正常工作。


2

使用:

Query.query <@ ... @>
|> List.sortBy (fun (sec, _, _, _, _, _, _, _, _) -> sec)

请注意在 F# 中使用具有如此多元素的元组是非常不好的风格。使用更加结构化的记录类型为字段命名并避免混淆。请勿写解释,保留 HTML 标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接