F# 迭代 KeyValuePair 的 Seq 并打印所有键、值。如果列表不为空则 failwithf

F# Iterate a Seq of KeyValuePair and print all Key, Values. Then failwithf if the list is not empty

我有一个 KeyValuePair 序列,我想打印所有键和值,然后如果列表不为空且变量值为真 (failOnError),我想失败。

我的尝试如下,但它总是在第一次迭代打印 1 个 KeyValuePair 后失败。

Seq.map(fun kvp -> 
               printfn "Key: %s" kvp.Key
               printfn "Value: %s" kvp.Value
               kvp)
    |> fun seq ->
        if not (Seq.isEmpty seq) && failOnError
        then
            failwithf "There is Errors see above messages"

有什么想法吗?

F# 中的序列是 惰性的:它们只会根据需要迭代尽可能多的元素。有些操作需要获取序列的所有元素,例如 Seq.toList。但是 Seq.map 不是其中之一:当您执行 Seq.map 时,您仍然有一个尚未遍历任何元素的惰性序列。 Seq.isEmpty 只会遍历 一个 元素,因为这就是证明序列不为空所需的全部内容。

您可能想要用 Seq.toList |> List.isEmpty 替换 Seq.isEmpty。然后您将最终遍历所有元素。另请注意,无论 是否 您的 failOnError 值是否为真,您最终都会遍历所有元素。如果您想在 failOnError 为 false 时仅 打印键和值,那么您应该更改 if 语句的顺序:if failOnError && not (seq |> Seq.toList |> List.isEmpty)