2016-09-14 8 views
-1

これはSO-postへのフォローアップの質問です。このコードブロックを考えるとseqのxのxをseqに変換する方法

(csvData1は、.csvファイルである。)

let mappedSeq1 = seq { for csvRow in csvData1 do yield (csvRow.[2], csvRow.[5]) } 

for x in mappedSeq1 do 
    printfn "%A" x 

我々はyを呼び出すことができ、私はxにシーケンスの各要素を展開したくない場合はどうと第二のval。 xをシーケンスに変換するには、Seq.fstSeq.sndを使用できますか?

これらの要素を解凍することは可能です。私の質問は、特にxがSystem.Tupleであることを考えると、これを行う別の方法を見つけることです。それはシーケンスからどのようyieldそれをだから

+0

* "what is' x'? "*タイプ情報の開発ツールを使用していますか?例えば、Visual Studioでは、その上にマウスを置くことによって 'x'の型を見ることができます。 –

+0

はい、xはSystem.Tupleですが、Seq.fstなどを使用するようにコードを構造化することはできません。 – octopusgrabbus

+0

OPのx部分が削除されました。基本的には、解凍せずにSystem.Tupleから1番目または2番目の要素を取得します。多かれ少なかれ学問的な要求です。私はちょうど別の方法があるかどうか知りたい。 – octopusgrabbus

答えて

4

xは、(私はcsvRow.[i]仮定何であるかである)2つのstring Sのタプルです。

for (x,y) in mappedSeq1 do 
    printfn "%s - %s" x y 

またはあなたがXをdestructureしたくない場合は、fst xsnd xを使用することができます。そして、あなたは右のあなたのforループでそれをdestructureすることができます。

+0

私はxを破壊したくありません。それを記述するためのより良い方法がないため、xをSeqにキャストしたいので、Seqのメソッドを使用できます。 – octopusgrabbus

+0

'fst' /' snd'はとにかく内部的にタプルの構造を解消します... – scrwtp

+1

「どのようにしてxをSeqにキャストしたいか」はわかりません。 'x'はシーケンスではなくタプルなので、あなたはそれを"キャスト "できません。その中の2つの要素を持つシーケンスを作成しようとしていることを意味しましたか?それではリストを作るだけです。 '[x; y] 'とする。他に何か意味がありましたか? –

0

あなたのコードは、現在の行を読み取り、あなたがRow0Col2のシーケンスを返すようにしたい場合は、列2および5

のタプルを生成シーケンスを作成します。 Row0Col5; Row1Col2; Row1Col5(2つのカラムは同じタイプである必要があります)、その後、

yield! [ csvRow.[2], csvRow.[5] ]

を使用するか、配列の配列をしたい場合 - [Row0Col2。 Row0Col5]; [Row1Col2; Ro1Col5]、次いで

yield [ csvRow.[2]; csvRow.[5] ]

yield!を使用yieldがちょうど順序でリストをもたらす一方で、リストから各アイテムをもたらします。

関連する問題