Dictionary<_,_> – и 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])
Seq.orderвызовы - person Random Dev   schedule 22.03.2012Seq.groupBy), но было бы неплохо также сохранить порядок элементов. - person Daniel   schedule 22.03.2012