Dictionary<_,_>
-and Seq.groupBy
通過伸展出現枚舉元素中的插入順序,然而順序是正式未定義(見this question)。Seq.groupBy:保留原始順序
下面是一些代碼來演示:
let groupByPreservesOrder l =
let l2 =
l
|> Seq.groupBy id
|> Seq.map fst
|> Seq.toList
(l = l2)
let l = List.init 1000 (fun i ->
if i % 2 <> 0 then -(i) else i/2)
groupByPreservesOrder l //true
我需要一組功能保證此行爲。什麼是最好的(認真,高效,慣用,...)的方式去做呢?
編輯
下面是做這件事:
let groupByStable f items =
let items = items |> Seq.map (fun x -> f x, x) |> Seq.toList
let d = items |> Seq.groupBy fst |> dict
items
|> Seq.distinctBy fst
|> Seq.map (fun (k, _) -> k, Seq.map snd d.[k])
我是啞巴還是這個問題有點混亂? – ChaosPandion 2012-03-22 15:27:55
如果你需要它*保證*我想你要麼必須自己實施或使用(一些)'Seq.order'調用 – Carsten 2012-03-22 15:29:16
@ChaosPandion:我不確定。 :-) – Daniel 2012-03-22 15:30:51