F# Seq.groupBy是否保留组内的顺序?

F# Seq.groupBy是否保留组内的顺序?,f#,sequences,F#,Sequences,我想对一个序列进行分组,然后取组中每个元素的第一个匹配项。当我尝试这个的时候 Seq.groupBy f inSeq |> Seq.map (fun (k,s) -> (k,s|>Seq.take 1|>Seq.exactlyOne)) 我发现有时候我从s得到了不同的元素。这是预期的吗 是的,这是意料之中的。序列(seq)不保证安全。您可以定义一个序列,该序列将在每次迭代时生成不同的值。如果调用Seq.take 1两次,可以得到不同的结果 例如,考虑以下顺序: open

我想对一个序列进行分组,然后取组中每个元素的第一个匹配项。当我尝试这个的时候

Seq.groupBy f inSeq
|> Seq.map (fun (k,s) -> (k,s|>Seq.take 1|>Seq.exactlyOne))

我发现有时候我从s得到了不同的元素。这是预期的吗

是的,这是意料之中的。序列(
seq
)不保证安全。您可以定义一个序列,该序列将在每次迭代时生成不同的值。如果调用
Seq.take 1
两次,可以得到不同的结果

例如,考虑以下顺序:

open System

let r = Random ()
let s = seq { yield r.Next(0, 9) }
如果您在上面调用
Seq.take 1
,您可能会得到不同的结果:

> s |> Seq.take 1;;
val it : seq<int> = seq [4]
> s |> Seq.take 1;;
val it : seq<int> = seq [1]
如果您想保证确定性行为,请使用
列表

查看- 以下是相关信息:

// Build the groupings

seq |> iter (fun v ->
    let safeKey = keyf v
    let mutable prev = Unchecked.defaultof<_>
    match dict.TryGetValue (safeKey, &prev) with
    | true -> prev.Add v
    | false ->
        let prev = ResizeArray ()
        dict.[safeKey] <- prev
        prev.Add v)
//构建分组
国际热核实验堆(国际热核聚变实验堆)
让safeKey=keyf v
设mutable prev=Unchecked.defaultof
将dict.TryGetValue(safeKey和prev)与
|true->prev.添加v
|错误->
设prev=ResizeArray()

dict.[safeKey]是的,我应该在第二行使用Seq.head,但我想一字不差地分享我正在使用的代码。:)发生这种情况时,你能隔离案例吗?。。。或者在某些情况下,可以使用
Seq.cache
来“固定”
Seq
(但结束行将事情重新建模为应该的样子)谢谢,这是我所期望的,但出于某种原因,我收到了一些不同的东西。不幸的是,现在我无法重现这个问题。@RobertSim一定是“我的机器上有工作”的案例™" 反过来说。
// Build the groupings

seq |> iter (fun v ->
    let safeKey = keyf v
    let mutable prev = Unchecked.defaultof<_>
    match dict.TryGetValue (safeKey, &prev) with
    | true -> prev.Add v
    | false ->
        let prev = ResizeArray ()
        dict.[safeKey] <- prev
        prev.Add v)