半角文字を全角文字に変換

以下のコードをそのままC#またはVBには移植不可
F#のための軽そう?なコードを自作してみました。


■実行結果

> "゙ア゙イヴエオ゙".StrCnv();;
> リアル: 00:00:00.000、CPU: 00:00:00.000、GC gen0: 0, gen1: 0, gen2: 0
val it : System.String = "゛ア゛イヴエオ゛"


■コード

module StringCommon =
    let private map =
        Seq.cache <|
            seq {
                yield ('!','!')
                yield ('"','”')
                yield ('#','#')
                yield ('$','$')
                yield ('%','%')
                yield ('&','&')
                yield ('\'','’')
                yield ('(','(')
                yield (')',')')
                yield ('*','*')
                yield ('+','+')
                yield (',',',')
                yield ('-','−')
                yield ('.','.')
                yield ('/','/')
                yield (':',':')
                yield (';',';')
                yield ('<','<')
                yield ('=','=')
                yield ('>','>')
                yield ('?','?')
                yield ('@','@')
                yield ('A','A')
                yield ('B','B')
                yield ('C','C')
                yield ('D','D')
                yield ('E','E')
                yield ('F','F')
                yield ('G','G')
                yield ('H','H')
                yield ('I','I')
                yield ('J','J')
                yield ('K','K')
                yield ('L','L')
                yield ('M','M')
                yield ('N','N')
                yield ('O','O')
                yield ('P','P')
                yield ('Q','Q')
                yield ('R','R')
                yield ('S','S')
                yield ('T','T')
                yield ('U','U')
                yield ('V','V')
                yield ('W','W')
                yield ('X','X')
                yield ('Y','Y')
                yield ('Z','Z')
                yield ('[','[')
                yield ('\\','¥')
                yield (']',']')
                yield ('^','^')
                yield ('_','_')
                yield ('`','‘')
                yield ('a','a')
                yield ('b','b')
                yield ('c','c')
                yield ('d','d')
                yield ('e','e')
                yield ('f','f')
                yield ('g','g')
                yield ('h','h')
                yield ('i','i')
                yield ('j','j')
                yield ('k','k')
                yield ('l','l')
                yield ('m','m')
                yield ('n','n')
                yield ('o','o')
                yield ('p','p')
                yield ('q','q')
                yield ('r','r')
                yield ('s','s')
                yield ('t','t')
                yield ('u','u')
                yield ('v','v')
                yield ('w','w')
                yield ('x','x')
                yield ('y','y')
                yield ('z','z')
                yield ('{','{')
                yield ('|','|')
                yield ('}','}')
                yield ('~',' ̄')
                yield ('`','`')
                yield ('〜','〜')
                yield ('。','。')
                yield ('「','「')
                yield ('」','」')
                yield ('、','、')
                yield ('・','・')
                yield ('ヲ','ヲ')
                yield ('ァ','ァ')
                yield ('ィ','ィ')
                yield ('ゥ','ゥ')
                yield ('ェ','ェ')
                yield ('ォ','ォ')
                yield ('ャ','ャ')
                yield ('ュ','ュ')
                yield ('ョ','ョ')
                yield ('ッ','ッ')
                yield ('ー','ー')
                yield ('ア','ア')
                yield ('イ','イ')
                yield ('ウ','ウ')
                yield ('エ','エ')
                yield ('オ','オ')
                yield ('カ','カ')
                yield ('キ','キ')
                yield ('ク','ク')
                yield ('ケ','ケ')
                yield ('コ','コ')
                yield ('サ','サ')
                yield ('シ','シ')
                yield ('ス','ス')
                yield ('セ','セ')
                yield ('ソ','ソ')
                yield ('タ','タ')
                yield ('チ','チ')
                yield ('ツ','ツ')
                yield ('テ','テ')
                yield ('ト','ト')
                yield ('ナ','ナ')
                yield ('ニ','ニ')
                yield ('ヌ','ヌ')
                yield ('ネ','ネ')
                yield ('ノ','ノ')
                yield ('ハ','ハ')
                yield ('ヒ','ヒ')
                yield ('フ','フ')
                yield ('ヘ','ヘ')
                yield ('ホ','ホ')
                yield ('マ','マ')
                yield ('ミ','ミ')
                yield ('ム','ム')
                yield ('メ','メ')
                yield ('モ','モ')
                yield ('ヤ','ヤ')
                yield ('ユ','ユ')
                yield ('ヨ','ヨ')
                yield ('ラ','ラ')
                yield ('リ','リ')
                yield ('ル','ル')
                yield ('レ','レ')
                yield ('ロ','ロ')
                yield ('ワ','ワ')
                yield ('ン','ン')
                yield ('゙','゛')
                yield ('゚','゜')
            }
    let private dmap =
        Seq.cache <|
            seq {
                yield (('カ','゙'),'ガ')
                yield (('キ','゙'),'ギ')
                yield (('ク','゙'),'グ')
                yield (('ケ','゙'),'ゲ')
                yield (('コ','゙'),'ゴ')
                yield (('サ','゙'),'ザ')
                yield (('シ','゙'),'ジ')
                yield (('ス','゙'),'ズ')
                yield (('セ','゙'),'ゼ')
                yield (('ソ','゙'),'ゾ')
                yield (('タ','゙'),'ダ')
                yield (('チ','゙'),'ヂ')
                yield (('ツ','゙'),'ヅ')
                yield (('テ','゙'),'デ')
                yield (('ト','゙'),'ド')
                yield (('ハ','゙'),'バ')
                yield (('ハ','゚'),'パ')
                yield (('ヒ','゙'),'ビ')
                yield (('ヒ','゚'),'ピ')
                yield (('フ','゙'),'ブ')
                yield (('フ','゚'),'プ')
                yield (('ヘ','゙'),'ベ')
                yield (('ヘ','゚'),'ペ')
                yield (('ホ','゙'),'ボ')
                yield (('ホ','゚'),'ポ')
                yield (('ウ','゙'),'ヴ')
            }
    /// charの初期値として使用
    let private cn = '\000'
    /// 全角へ変換
    let private fwtransfer c =
        map |> Seq.tryFind(fst >> (=)c)
        |> (fun o -> if o.IsSome then snd o.Value else c)
    /// 濁点半濁点が続く半角2文字を全角文字に変換
    let private dfwtransfer t =
        dmap |> Seq.tryFind(fst >> (=)t)
        |> (fun o -> if o.IsSome then Some <| snd o.Value else None)
    /// 配列を文字列に変換
    let private toString (arr:char[]) = System.String(arr)
    type System.String with
        member x.StrCnv() =
//            x |> Seq.map fwtransfer |> Seq.toArray |> toString        // 半角1文字を全角にする
            x |> Seq.fold (fun (l,(a,b)) c ->
                match (a,b) with
                | ('\000',_)
                | (_,'\000') -> l,(b,c)
                | t ->
                    match (dfwtransfer t) with
                    | Some d -> l@[d],(cn,c)
                    | None -> l@[fwtransfer a],(b,c)
            ) ([],(cn,cn))
            // ↓がなんとかならないのか・・・ださい!
            |> (fun (l,(a,b)) ->
                match (a,b) with
                | ('\000',b) -> l,[b]
                | (a,'\000') -> l,[a]
                | (a,b) -> l,[a;b;]
                |> (fun (l,l2) ->
                    l2 |> List.map fwtransfer
                    |> List.append l
                    |> List.toArray)
                |> toString
            )


//