Самый простой способ проанализировать форматированные данные "querystring"

Со следующим кодом:

string q = "userID=16555&gameID=60&score=4542.122&time=343114";

Каким будет самый простой способ проанализировать значения, желательно без написания собственного анализатора? Я ищу что-то с той же функциональностью, что и Request.querystring["gameID"].

Ответ 1

Довольно легко... Используйте метод HttpUtility.ParseQueryString.

Неподтвержденный, но это должно работать:

var qs = "userID=16555&gameID=60&score=4542.122&time=343114";
var parsed = HttpUtility.ParseQueryString(qs);
var userId = parsed["userID"]; 
//  ^^^^^^ Should be "16555".  Note this will be a string of course.

Ответ 2

Вы можете сделать это с помощью linq, как это.

string query = "id=3123123&userId=44423&format=json";

Dictionary<string,string> dicQueryString = 
        query.Split('&')
             .ToDictionary(c => c.Split('=')[0],
                           c => Uri.UnescapeDataString(c.Split('=')[1]));

string userId = dicQueryString["userID"];

Edit

Если вы можете использовать HttpUtility.ParseQueryString, тогда он будет намного более прямым, и он не будет чувствителен к регистру, как в случае с LinQ.

Ответ 3

Как уже упоминалось в каждом из предыдущих ответов, если вы находитесь в контексте, где вы можете добавить зависимость от библиотеки System.Web, используя HttpUtility.ParseQueryString имеет смысл. (Для справки, соответствующий источник можно найти в Справочный источник Microsoft). Однако, если это невозможно, я хотел бы предложить следующую модификацию для ответа Adil, который учитывает многие проблемы, затронутые в комментариях (например, чувствительность к регистру и дублирующиеся ключи):

var q = "userID=16555&gameID=60&score=4542.122&time=343114";
var parsed = q.TrimStart('?')
    .Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(k => k.Split('='))
    .Where(k => k.Length == 2)
    .ToLookup(a => a[0], a => Uri.UnescapeDataString(a[1])
      , StringComparer.OrdinalIgnoreCase);
var userId = parsed["userID"].FirstOrDefault();
var time = parsed["TIME"].Select(v => (int?)int.Parse(v)).FirstOrDefault();

Ответ 4

Если вы хотите избежать зависимости от System.Web, который должен использовать HttpUtility.ParseQueryString, вы можете использовать Uri метод расширения ParseQueryString найден в System.Net.Http.

Обратите внимание, что вам нужно преобразовать тело ответа в действительный Uri, чтобы ParseQueryString работал.

Также обратите внимание, что в документе MSDN этот метод является методом расширения для класса Uri, поэтому вам нужна ссылка на сборку System.Net.Http.Formatting(в System.Net.Http.Formatting.dll). Я попытался установить его с помощью пакета nuget с именем "System.Net.Http.Formatting", и он отлично работает.

string body = "value1=randomvalue1&value2=randomValue2";

// "http://localhost/query?" is added to the string "body" in order to create a valid Uri.
string urlBody = "http://localhost/query?" + body;
NameValueCollection coll = new Uri(urlBody).ParseQueryString();