Лучший способ конвертировать строку запроса в словарь в С#
Я ищу простейший способ преобразования строки запроса из запроса HTTP GET в словарь и обратно.
Я считаю, что проще выполнять различные манипуляции по запросу, когда он находится в форме словаря, но у меня, похоже, много кода, чтобы сделать преобразование. Любые рекомендуемые способы?
Ответы
Ответ 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]);
Ответ 3
Как насчет HttpUtility.ParseQueryString
?
Просто добавьте ссылку на System.Web.dll
Ответ 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
Какой словарь