F#基础:将NameValueCollection转换为漂亮的字符串

时间:2012-10-29 15:40:34

标签: .net collections f#

在尝试同时做一些有用的事情时学习F#,所以这是一个基本问题:

我有reqHttpListenerRequest,其QueryString属性,类型为System.Collections.Specialized.NameValueCollection。所以,为了清楚起见,我要说,

let queryString = req.QueryString

现在我想从内容中生成好的字符串(不是printf到控制台),但显然没有覆盖queryString.ToString(),所以它只提供字符串“System.Collections.Specialized.NameValueCollection”。

那么,什么是F#one-liner来获得一个很好的字符串,比如“key1 = value1 \ nkey2 = value2 \ n ...”?

4 个答案:

答案 0 :(得分:4)

这样的事情应该有效:

let nvcToString (nvc:System.Collections.Specialized.NameValueCollection) =
    System.String.Join("\n", 
                       seq { for key in nvc -> sprintf "%s=%s" key nvc.[key] })

答案 1 :(得分:4)

nvc.AllKeys
|> Seq.map (fun key -> sprintf "%s=%s" key nvc.[key])
|> String.concat "\n"

答案 2 :(得分:1)

我使用此代码来处理具有多个值的键的情况,这在NameValueCollection中是合法的,而我在其他答案中没有看到。我还使用MS AntiXSS library对值进行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)

答案 3 :(得分:0)

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

效率极低并且直接从我脑海中创建了大量的字符串实例。 :)