gpt4 book ai didi

F#:将旧的 IEnumerable.GetEnumerator() 样式迭代器转换为 seq

转载 作者:行者123 更新时间:2023-12-04 23:00:10 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How do I deal with IEnumerable in F#?

(1 个回答)


5年前关闭。




.NET 标准库中仍有一些东西只暴露了老派 IEnumerable.GetEnumerator()对外界的迭代器,对 F# seq-processing 风格不太友好。我正在快速搜索一下如何获取 Regex.Match(...) 的结果组进入我可以处理的列表,但没有找到任何东西。

我有这个:

open System.Text.RegularExpressions
let input = "args=(hello, world, foo, bar)"
let mtc = Regex.Match( input, "args=\(([\w\s,]+)\)" )

我想要访问 mtc.Groups作为 seq 或列表,但它不允许这样做,因为它是 ye olde ICollection ,它只公开一个 GetEnumerator()方法。所以虽然你可以做
mtc.Groups.[1].Value

你不能做
mtc.Groups |> Seq.skip 1 // <=== THIS QUESTION IS ABOUT HOW TO ACHIEVE THIS

因为这导致
error FS0001: The type 'Text.RegularExpressions.GroupCollection' is not compatible with the type 'seq<'a>

(为了清楚起见, GroupCollection 实现了 ICollection ,它是 IEnumerable 的子接口(interface)。)

那么问题来了:如何巧妙地转一个 GetEnumerator()成一个序列?

最佳答案

答案其实并不复杂,它只是为下一个正在谷歌搜索快速答案的人准备的。这个想法是将可怕的命令性包装在 seq {...} 中。表达式,然后转换结果 seq<obj>无论你碰巧知道结果是什么。

seq { let i = mtc.Groups.GetEnumerator() in while i.MoveNext() do yield i.Current } 
|> Seq.cast<Text.RegularExpressions.Group>
|> Seq.map (fun m -> m.Value)
|> List.ofSeq

当在上述输入上运行时,这会产生所需的输出:
val input : string = "args=(hello, world, foo, bar)"
val mtc : Match = args=(hello, world, foo, bar)
val it : string list = ["args=(hello, world, foo, bar)"; "hello, world, foo, bar"]

正如我所说,我把它放在这里是为了下一个 googler 的答案,所以欢迎改进、建议、downvotes、dupe flags。

编辑:根据第一条评论中的建议, Seq.cast聪明到能吃 IEnumerable s 直接。所以 seq-expression 是完全没有必要的,答案就是 Seq.cast<Text.RegularExpressions.Group> !让我知道我是否应该删除这个问题。

关于F#:将旧的 IEnumerable.GetEnumerator() 样式迭代器转换为 seq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37523103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com