4

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

我有req,这是 a HttpListenerRequest,它具有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

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

我使用此代码,它处理具有多个值的键的情况,这在 a 中是合法的NameValueCollection,而我在其他答案中没有看到。我还使用 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 回答