4

F# を学びながら同時に何か役に立つことをしようとしているので、これは一種の基本的な質問です。

私は を持っていますreq。これは、プロパティHttpListenerRequestを持つであり、タイプはです。ですから、わかりやすくするために、私はQueryStringSystem.Collections.Specialized.NameValueCollection

let queryString = req.QueryString

今、私はその内容から素敵な文字列(コンソールへのprintfではない)を生成したいのですが、queryString.ToString()明らかにオーバーライドされていないので、文字列「System.Collections.Specialized.NameValueCollection」を与えるだけです。

では、"key1=value1\nkey2=value2\n..." のような適切な文字列を取得するための F# ワンライナーは何ですか?

4

4 に答える 4

4

このようなものはうまくいくはずです:

let nvcToString (nvc:System.Collections.Specialized.NameValueCollection) =
    System.String.Join("\n", 
                       seq { for key in nvc -> sprintf "%s=%s" key nvc.[key] })
于 2012-10-29T15:52:56.167 に答える
4
nvc.AllKeys
|> Seq.map (fun key -> sprintf "%s=%s" key nvc.[key])
|> String.concat "\n"
于 2012-10-29T16:05:33.877 に答える
1

複数の値を持つキーのケースを処理するこのコードを使用します。これは aNameValueCollectionで合法ですが、他の回答には表示されません。また、MS AntiXSS ライブラリを使用して値を URL エンコードしています。

編集:おっと、OPを十分に読んでいませんでした。Request.QueryString実際のクエリ文字列に戻りたいと思っていました。NameValueCollectionキーごとに複数の値を許可することは依然として真実であるため、この回答は残しておきます。

type NameValueCollection with
    /// Converts the collection to a URL-formatted query string.
    member this.ToUrlString() =
        // a key can have multiple values, so flatten this out, repeating the key if necessary
        let getValues (key:string) =
            let kEnc = Encoder.UrlEncode(key) + "="
            this.GetValues(key)
            |> Seq.map (fun v -> kEnc + Encoder.UrlEncode(v))

        let pairs = this.AllKeys |> Seq.collect getValues

        String.Join("&", pairs)
于 2012-11-15T19:51:36.420 に答える
0

kvs.AllKeys |> Seq.map (fun i -> i+ " = " + kvs.[i]) |> Seq.fold (fun s t -> s + "\n" + t) ""

非常に非効率的で、頭から直接、多くの文字列インスタンスを作成します。:)

于 2012-10-29T15:55:25.683 に答える