Подтвердить что ты не робот

Лучший способ конвертировать строку запроса в словарь в С#

Я ищу простейший способ преобразования строки запроса из запроса HTTP GET в словарь и обратно.

Я считаю, что проще выполнять различные манипуляции по запросу, когда он находится в форме словаря, но у меня, похоже, много кода, чтобы сделать преобразование. Любые рекомендуемые способы?

4b9b3361

Ответ 1

HttpUtility.ParseQueryString() анализирует строку запроса в объект NameValueCollection, преобразование последнего в IDictionary<string, string> является вопросом простого foreach. Это, однако, может быть ненужным, поскольку NameValueCollection имеет индекс, поэтому он ведет себя как словарь.

Ответ 2

Вот как я обычно это делаю

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

Ответ 4

Просто нужно было сделать это для моно-совместимого решения

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

Ответ 5

Мне нравится краткость ответ Джона Коннинга, но в интересах разнообразия, вот еще одна альтернатива его ответу, которая также будет работать для ограниченных сред, таких как Windows Телефон 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;
    }

На самом деле полезным улучшением ответа 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 ));
    }

Ответ 6

То же, что и Шон, но с 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))));
}

Ответ 7

Один вкладыш без HttpUtility

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

Ответ 8

Еще один способ сделать это:

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

Ответ 9

Самый простой:

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

В ASP.NET Core используйте ParseQuery.

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

Ответ 11

Вместо преобразования HttpContext.Request.QueryString в словарь <> попробуйте использовать

HttpContext.Request.Query

Какой словарь