总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'
答案 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#中使用具有那么多元素的元组是非常糟糕的样式。使用更像结构类似记录类型的东西来给字段命名并避免混淆。