2016-07-27 7 views
6

このようなキャストを行ううまくいっているのはなんですか?objから文字列へのseq.castタプル値

seq { yield (box "key", box "val") } 
|> Seq.cast<string*string> 

これは非常に醜いので:

seq { yield (box "key", box "val") } 
|> Seq.map (fun (k,v) -> k.ToString(), v.ToString()) 

だけでなく、この:

seq { yield (box "key", box "val") } 
|> Seq.map (fun (k,v) -> unbox<string>(k), unbox<string>(v)) 

は "VHS版" への道別のタプルにタプルありますか?あなたに少しよりよいそれを書くことができ

+1

unBoxString(k、v)関数で除算するだけです。また、Boxedオブジェクト上で直接.ToString()を呼び出すことができます。 – s952163

+0

提案していただきありがとうございますが、私はボックス化されたタプルで 'ToString()'を呼び出すことはできません。そして私は代わりに2つの文字列のタプルを取得したい。 – derwasp

+0

はい、もちろんです。私はMarkの答えのように、文字列関数が使われているように意味しました。すでに行っているボックス化されたオブジェクトごとに呼び出す必要があります。私はそれが "醜い"と感じたら、ライナーを書くのは簡単だと思います。多くのヘルパー機能を持つことは慣用的です。その答えがその良い例です。 – s952163

答えて

8

seq { yield (box "key", box "val") } 
|> Seq.map (fun (k, v) -> string k, string v) 

想像し、しかし、あなたはTuple2モジュールがあること:そのようmapBoth機能付き

module Tuple2 = 
    // ... other functions ... 

    let mapBoth f g (x, y) = f x, g y 

    // ... other functions ... 

を、あなたにあなたのキャストを書くことができます:

seq { yield (box "key", box "val") } |> Seq.map (Tuple2.mapBoth string string) 

ありません。Tuple2モジュールはで、FSharp.Coreはですが、私はしばしば私のプロジェクトに上記のようなさまざまな便利な1ライナーを含むものを定義します。

+0

'string k、string v'はもう少し良くなっています。私の場合はビルドスクリプトなので、モジュールを作成するとは思わないので、最初に提案されたオプションを使用します。 – derwasp

関連する問題