using System;
using System.Collections.Specialized;
using System.Web;
namespace QueryStringParserApp
{
class Program
{
/// <summary>
/// Parses and decodes a complete URL query string into a NameValueCollection.
/// </summary>
/// <param name="queryString">The URL query string (with or without leading '?').</param>
/// <returns>A NameValueCollection containing decoded keys and values.</returns>
static NameValueCollection ParseAndDecodeQuery(string queryString)
{
// Remove leading '?' if present
if (!string.IsNullOrEmpty(queryString) && queryString.StartsWith("?")) {
queryString = queryString.Substring(1);
}
// HttpUtility.ParseQueryString automatically decodes keys and values,
// and supports multi-value parameters.
return HttpUtility.ParseQueryString(queryString);
}
static void Main(string[] args)
{
string fullQuery = "search=csharp+tutorial&category=programming&tag=beginner&tag=dotnet";
Console.WriteLine("--- Full Query String Parsing ---");
Console.WriteLine($"Original Query: {fullQuery}");
NameValueCollection paramsCollection = ParseAndDecodeQuery(fullQuery);
Console.WriteLine("Decoded Parameters Result:");
foreach (string key in paramsCollection.AllKeys)
{
// GetValues handles multiple parameters with the same key (e.g., 'tag')
string[] values = paramsCollection.GetValues(key);
Console.WriteLine($" {key} -> [{string.Join(", ", values)}]");
}
}
}
}
/*
run:
--- Full Query String Parsing ---
Original Query: search=csharp+tutorial&category=programming&tag=beginner&tag=dotnet
Decoded Parameters Result:
search -> [csharp tutorial]
category -> [programming]
tag -> [beginner, dotnet]
*/