56 c#
我正在寻找将查询字符串从HTTP GET请求转换为字典的最简单方法,然后再返回.
我认为一旦它以字典形式对查询进行各种操作就会更容易,但我似乎有很多代码只是为了进行转换.有推荐的方法吗?
Ant*_*lev 64
HttpUtility.ParseQueryString()将查询字符串解析为NameValueCollection对象,将后者转换IDictionary<string, string>为a是一个简单的问题foreach.但是,这可能是不必要的,因为它NameValueCollection有一个索引器,所以它的行为非常像字典.
小智 30
这是我通常这样做的方式
Dictionary<string, string> parameters = HttpContext.Current.Request.QueryString.Keys.Cast<string>()
.ToDictionary(k => k, v => HttpContext.Current.Request.QueryString[v]);
Run Code Online (Sandbox Code Playgroud)
只需要为单声道兼容的解决方案做到这一点
Regex.Matches(queryString, "([^?=&]+)(=([^&]*))?").Cast<Match>().ToDictionary(x => x.Groups[1].Value, x => x.Groups[3].Value)
Run Code Online (Sandbox Code Playgroud)
与Sean相同,但使用Linq(以及可以复制和粘贴的功能):
public static Dictionary<string, string> ParseQueryString(string queryString)
{
var nvc = HttpUtility.ParseQueryString(queryString);
return nvc.AllKeys.ToDictionary(k => k, k => nvc[k]);
}
Run Code Online (Sandbox Code Playgroud)
此外,问题是如何将其恢复到查询字符串:
public static string CreateQueryString(Dictionary<string, string> parameters)
{
return string.Join("&", parameters.Select(kvp =>
string.Format("{0}={1}", kvp.Key, HttpUtility.UrlEncode(kvp.Value))));
}
Run Code Online (Sandbox Code Playgroud)
我喜欢Jon Canning的答案的简洁,但为了多样化,这里是他的答案的另一种选择,这也适用于像Windows Phone 8这样缺乏HttpUtility.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;
}
Run Code Online (Sandbox Code Playgroud)
实际上,对Canning的答案进行了有用的改进,以便解码url编码的值(如上面的解决方案):
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 ));
}
Run Code Online (Sandbox Code Playgroud)
在 ASP.NET Core 中,使用ParseQuery。
var query = HttpContext.Request.QueryString.Value;
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);
Run Code Online (Sandbox Code Playgroud)
一个不带HttpUtility的衬板
var dictionary = query.Replace("?", "").Split('&').ToDictionary(x => x.Split('=')[0], x => x.Split('=')[1]);
Run Code Online (Sandbox Code Playgroud)
还有另一种方法:
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));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39894 次 |
| 最近记录: |