如何在F#中订购LIST

时间:2010-11-30 19:43:24

标签: f#

总F#n00b问题。 如何对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

当我将最后一行代码改为此时:
            } @&gt; |&GT; List.ofSeq.sortBy fst
我得到以下内容:

  

错误1未定义字段,构造函数或成员'sortBy'

嗯,多么痛苦。我现在正在尝试这个:

|> List.ofSeq |> List.sortBy

但我得到了这个:

  

错误1类型不匹配。期待(安全* RoleContributor * RoleContributor * SuggestedTrade * SuggestedTradeRecommendation * Idea * RoleContributor * SupportingUploadedFile * LargeText)列表 - &gt; 'a但给定a('b - &gt;'c) - &gt; 'b list - &gt; 'b list'类型'(Security * RoleContributor * RoleContributor * SuggestedTrade * SuggestedTradeRecommendation * Idea * RoleContributor * SupportingUploadedFile * LargeText)list'与type''a - &gt;不匹配'b'

3 个答案:

答案 0 :(得分:5)

Seq.sortBy会这样做。

但是排序意味着您在排序时知道完整序列的关键值,因此根据定义,您无法在无限序列上使用它。

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

MSDN示例:

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

编辑2:

从你的新例子看,你似乎有一个元组列表。现在它取决于你想要搜索的元组中的哪个项目。

答案 1 :(得分: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 :(得分:2)

使用:

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

请注意,在F#中使用具有那么多元素的元组是非常糟糕的样式。使用更像结构类似记录类型的东西来给字段命名并避免混淆。