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