在C#中将查询string转换为字典的最佳方法

我正在寻找从HTTP GET请求转换为一个字典,然后再返回查询string的最简单的方法。

我认为一旦字典forms的查询对查询执行各种操作更容易,但我似乎有很多代码只是为了进行转换。 任何推荐的方式?

HttpUtility.ParseQueryString()将查询stringparsing为一个NameValueCollection对象,将后者转换为IDictionary<string, string>是一个简单的foreach 。 然而,这可能是不必要的,因为NameValueCollection有一个索引器,所以它的行为几乎就像一个字典。

这是我通常如何做的

  Dictionary<string, string> parameters = HttpContext.Current.Request.QueryString.Keys.Cast<string>() .ToDictionary(k => k, v => HttpContext.Current.Request.QueryString[v]); 

如何HttpUtility.ParseQueryString

只需添加一个对System.Web.dll的引用

只需要做一个单声道兼容的解决scheme

 Regex.Matches(queryString, "([^?=&]+)(=([^&]*))?").Cast<Match>().ToDictionary(x => x.Groups[1].Value, x => x.Groups[3].Value) 

我喜欢Jon Canning的答案 ,但为了多样化的利益,这里还有另外一种方法来解决他的问题,比如Windows Phone 8这样的缺lessHttpUtility.ParseQueryString()实用工具的受限环境。

  public static Dictionary<string, string> ParseQueryString(String query) { Dictionary<String, String> queryDict = new Dictionary<string, string>(); foreach (String token in query.TrimStart(new char[] { '?' }).Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries)) { string[] parts = token.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 2) queryDict[parts[0].Trim()] = HttpUtility.UrlDecode(parts[1]).Trim(); else queryDict[parts[0].Trim()] = ""; } return queryDict; } 

实际上,对于Canning的解决scheme,解决url编码值(如上面的解决scheme)的一个有用的改进是:

  public static Dictionary<string, string> ParseQueryString2(String query) { return Regex.Matches(query, "([^?=&]+)(=([^&]*))?").Cast<Match>().ToDictionary(x => x.Groups[1].Value, x => HttpUtility.UrlDecode( x.Groups[3].Value )); } 

还有另一种方法来做到这一点:

 NameValueCollection nvcData = HttpUtility.ParseQueryString(queryString); Dictionary<string, string> dictData = new Dictionary<string, string>(nvcData.Count); foreach (string key in nvcData.AllKeys) { dictData.Add(key, nvcData.Get(key)); } 

和Sean一样,但是使用Linq(以及可以复制和粘贴的function):

 public static Dictionary<string, string> ParseQueryString(string queryString) { var nvc = HttpUtility.ParseQueryString(queryString); return nvc.AllKeys.ToDictionary(k => k, k => nvc[k]); } 

另外,这个问题还问到如何让它回到查询string中:

 public static string CreateQueryString(Dictionary<string, string> parameters) { return string.Join("&", parameters.Select(kvp => string.Format("{0}={1}", kvp.Key, HttpUtility.UrlEncode(kvp.Value)))); } 

一个class轮没有HttpUtility

 var dictionary = query.Replace("?", "").Split('&').ToDictionary(x => x.Split('=')[0], x => x.Split('=')[1]);