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

时间:2009-04-22 08:00:13

标签: c#

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

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

13 个答案:

答案 0 :(得分:62)

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

答案 1 :(得分:30)

以下是我通常的做法

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

答案 2 :(得分:14)

HttpUtility.ParseQueryString怎么样?

只需添加对System.Web.dll

的引用即可

答案 3 :(得分:9)

只需为单声道兼容解决方案执行此操作

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

答案 4 :(得分:7)

我喜欢Jon Canning's answer的简洁,但为了多样化,这里是他的答案的另一种选择,这也适用于缺少HttpUtility.ParseQueryString()实用程序的受限环境,如Windows Phone 8 :

    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的解决方案的一个有用的改进,即解码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 ));
    }

答案 5 :(得分:6)

与Sean相同,但使用Linq(以及可以复制和粘贴的功能):

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

此外,问题是如何将其恢复为查询字符串:

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

答案 6 :(得分:5)

一个没有HttpUtility的衬里

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

答案 7 :(得分:4)

另一种方法:

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));
}

答案 8 :(得分:3)

在ASP.NET Core中,使用ParseQuery

var query = HttpContext.Request.QueryString.Value;
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);

答案 9 :(得分:0)

最简单:

Dictionary<string, string> parameters = new Dictionary<string, string>();

for (int i = 0; i < context.Request.QueryString.Count; i++)
{
    parameters.Add(context.Request.QueryString.GetKey(i), context.Request.QueryString[i]);
}

答案 10 :(得分:0)

代替 HttpContext.Request.QueryString转换为字典<>,请尝试使用

HttpContext.Request.Query which already is a Dictionary<string, StringValues>

答案 11 :(得分:0)

您可以通过用FromQueryAttribute装饰参数来获得它

public void Action([FromQuery] Dictionary<string, string> queries)
{
    ...
}

P.S。如果要为每个键获取多个值,可以将字典更改为Dictionary<string, List<string>>

答案 12 :(得分:0)

AspNet Core 现在自动包含 HttpRequest.Query,它的使用类似于带有键访问器的字典。

但是,如果您需要将其转换为日志记录或其他目的,您可以将该逻辑提取到扩展方法中,如下所示:

public static class HttpRequestExtensions
{
  public static Dictionary<string, string> ToDictionary(this IQueryCollection query)
  {
    return query.Keys.ToDictionary(k => k, v => (string)query[v]);
  }
}

然后,您可以像这样在 httpRequest 上使用它:

var params = httpRequest.Query.ToDictionary()

进一步阅读