在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]);