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

56 c#

我正在寻找将查询字符串从HTTP GET请求转换为字典的最简单方法,然后再返回.

我认为一旦它以字典形式对查询进行各种操作就会更容易,但我似乎有很多代码只是为了进行转换.有推荐的方法吗?

Ant*_*lev 64

HttpUtility.ParseQueryString()将查询字符串解析为NameValueCollection对象,将后者转换IDictionary<string, string>为a是一个简单的问题foreach.但是,这可能是不必要的,因为它NameValueCollection有一个索引器,所以它的行为非常像字典.

  • Request.QueryString已经是一个NameValueCollection,@ H70答案最容易放入字典`var parameters = Request.QueryString.Keys.Cast <string>().ToDictionary(k => k,v => Request.QueryString [ v]);` (14认同)

小智 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)

  • 请注意,它们的键可以为空,这将导致语句失败。我通过将 ".ToDictionary(k =&gt; k,..." 更改为 ".ToDictionary(k =&gt; k ?? "", ..." 来修复此问题。(您可以使用您认为的“k”的任何默认值)想。) (2认同)

Mar*_*ell 14

怎么样HttpUtility.ParseQueryString

只需添加对System.Web.dll的引用即可


Jon*_*ing 9

只需要为单声道兼容的解决方案做到这一点

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


Thi*_*Guy 8

与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)


nem*_*ixx 7

我喜欢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)


Jam*_*ruk 7

在 ASP.NET Core 中,使用ParseQuery

var query = HttpContext.Request.QueryString.Value;
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);
Run Code Online (Sandbox Code Playgroud)


vic*_*car 5

一个不带HttpUtility的衬板

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


Sea*_*mbo 5

还有另一种方法:

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)