Я использую следующий класс, чтобы помочь мне изменить и задать строки запроса. Хотя это не решает вашу конкретную проблему, вы можете использовать ее и добавить еще несколько собственных функций, чтобы выполнить все, что вы хотите. Мне просто удобно обрабатывать строки запроса как IDictionary, когда я хочу их изменить.
public static class QueryStringExtensions
{
/// <summary>
/// Creates a dictionary from a query string or other parameter collection
/// </summary>
/// <param name="queryString"></param>
/// <returns></returns>
public static IDictionary<string, string> ToDictionary(this NameValueCollection queryString)
{
var dict = new Dictionary<string, string>();
foreach (string key in queryString.Keys)
{
dict[key] = queryString[key];
}
return dict;
}
/// <summary>
/// Generates a query string from a dictionary
/// </summary>
/// <param name="dictionary"></param>
/// <returns></returns>
public static string ToQueryString(this IDictionary<string, string> dictionary)
{
if (dictionary.Count == 0) return "";
var items = new List<string>();
foreach (string key in dictionary.Keys)
{
items.Add(key + "=" + dictionary[key]);
}
return "?" + items.Concatenate("&");
}
/// <summary>
/// Generates a query stirng from a dictionary only using the keys in the keys parameter
/// </summary>
/// <param name="dictionary"></param>
/// <param name="keys"></param>
/// <returns></returns>
public static string ToQueryString(this IDictionary<string, string> dictionary, IEnumerable<string> keys)
{
var items = new List<string>();
foreach (string key in dictionary.Keys.Intersect(keys))
{
items.Add(key + "=" + dictionary[key]);
}
if (items.Count == 0) return "";
return "?" + items.Concatenate("&");
}
/// <summary>
/// joins an enumerable around a seperator.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="input"></param>
/// <param name="seperator"></param>
/// <returns></returns>
public static string Concatenate<T>(this IEnumerable<T> input, string seperator)
{
var ar = input.Select(i => i.ToString()).ToArray();
return string.Join(seperator, ar);
}
}