Ответ 1
HttpValueCollection, который вы используете в своем примере, на самом деле не является тривиальным, и использует множество других частей библиотеки System.Web для кодирования действительного URL-адреса http для вас. Вы можете извлечь источник для частей, которые вам нужны, но, скорее всего, они будут каскадом в несколько больше, чем вы думаете!
Если вы это понимаете и просто хотите что-то примитивное, потому что вы уже убедитесь, что ключи и значения закодированы правильно, проще всего просто свернуть свои собственные.
Вот пример, в виде метода расширения для NameValueCollection:
public static class QueryExtensions
{
public static string ToQueryString(this NameValueCollection nvc)
{
IEnumerable<string> segments = from key in nvc.AllKeys
from value in nvc.GetValues(key)
select string.Format("{0}={1}",
WebUtility.UrlEncode(key),
WebUtility.UrlEncode(value));
return "?" + string.Join("&", segments);
}
}
Вы можете использовать это расширение для построения строки запроса следующим образом:
// Initialise the collection with values.
var values = new NameValueCollection {{"Key1", "Value1"}, {"Key2", "Value2"}};
// Or use the Add method, if you prefer.
values.Add("Key3", "Value3");
// Build a Uri using the extension method.
var url = new Uri("http://baseurl.com/" + values.ToQueryString());