2016-05-30 3 views
4

古いクラスのIEnumerable.GetEnumerator()イテレータのみを公開する.NET標準ライブラリにはまだいくつか残っていますが、これはあまり親切ではありませんF#seq処理スタイル。私はどのように処理することができるリストにRegex.Match(...)の結果のグループを得るために迅速なGoogleをやっていた、何も見つかりませんでした。F#:旧式のIEnumerable.GetEnumerator()スタイルイテレータをseqに変換

私はこれを持っていた:

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

私が好きなことは、配列として、またはリストとしてmtc.Groupsへのアクセスを得ることですが、それはあなたがたICollection古風、ですので、それはこれを許可しないだけメソッドGetEnumerator()を公開します。ですから、これは明確にするために(

error FS0001: The type 'Text.RegularExpressions.GroupCollection' is not compatible with the type 'seq<'a> 

、その結果として、あなたは

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

を行うことはできません

mtc.Groups.[1].Value 

行うことができますが、GroupCollectionIEnumerableのサブインタフェースである、ICollectionを実装しています。 )

ですから、どうすればよいですか?私はきちんとGetEnumerator()をseqに変えますか?

+0

これはまれなことではありませんが、実際これは詐欺です。 GetEnumerator()は一度も言及されていないので、私はオリジナルを見つけられなかったと推測しています。それ以外は、全く同じです。 – mt99

答えて

3

答えは本当に複雑なものではなく、ただちに答えを求めている次の人のためのものです。考えはseq {...}の式で恐ろしい無能さを包み込み、その結果を知ることが起こったときに結果としてseq<obj>をキャストすることです。 、私が言ったように

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"] 

が、私は改善、提案して答え、次のGoogle社員がためにここにそれを入れている:上記の入力に実行

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 

が、これは必要な出力を生成しますdownvotes、dupeフラグは大歓迎です。

EDIT:最初のコメントの示唆によると、Seq.castは、IEnumerableを直接食べるほど巧妙です。したがって、seq-expressionは単に不要で、これに対する答えはちょうどSeq.cast<Text.RegularExpressions.Group>です!この質問を削除する必要があるかどうかを教えてください。

+5

'seq'式 - ' mtc.Groups |> Seq.cast 'も必要ではありません。 – Lee

+0

ああそうです、そうです。私は 'Seq.cast'のタイプに注意を払わなかった。どうもありがとう。 – mt99

関連する問題