在尝试同时做一些有用的事情时学习F#,所以这是一个基本问题:
我有req
,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 ...”?
答案 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) ""
效率极低并且直接从我脑海中创建了大量的字符串实例。 :)