Поскольку NameValueCollection
может иметь несколько значений для одного и того же ключа, если вас интересует формат строки запроса (поскольку она будет возвращаться как значения, разделенные запятыми, а не как "запись массива"), вы можете рассмотреть следующее.
Пример
var nvc = new NameValueCollection();
nvc.Add("key1", "val1");
nvc.Add("key2", "val2");
nvc.Add("empty", null);
nvc.Add("key2", "val2b");
Превратится в: key1=val1&key2[]=val2&empty&key2[]=val2b
вместо key1=val1&key2=val2,val2b&empty
.
Код
string qs = string.Join("&",
// "loop" the keys
nvc.AllKeys.SelectMany(k => {
// "loop" the values
var values = nvc.GetValues(k);
if(values == null) return new[]{ k };
return nvc.GetValues(k).Select( (v,i) =>
// 'gracefully' handle formatting
// when there's 1 or more values
string.Format(
values.Length > 1
// pick your array format: k[i]=v or k[]=v, etc
? "{0}[]={1}"
: "{0}={1}"
, k, HttpUtility.UrlEncode(v), i)
);
})
);
или, если вы неМне так нравится Линк ...
string qs = nvc.ToQueryString(); // using...
public static class UrlExtensions {
public static string ToQueryString(this NameValueCollection nvc) {
return string.Join("&", nvc.GetUrlList());
}
public static IEnumerable<string> GetUrlList(this NameValueCollection nvc) {
foreach(var k in nvc.AllKeys) {
var values = nvc.GetValues(k);
if(values == null) { yield return k; continue; }
for(int i = 0; i < values.Length; i++) {
yield return
// 'gracefully' handle formatting
// when there's 1 or more values
string.Format(
values.Length > 1
// pick your array format: k[i]=v or k[]=v, etc
? "{0}[]={1}"
: "{0}={1}"
, k, HttpUtility.UrlEncode(values[i]), i);
}
}
}
}
Как уже отмечалось в комментариях, за исключением этого ответа , большинство других ответов касаются сценария (Request.QueryString
является HttpValueCollection
, "not" a NameValueCollection
), а не буквальным вопросом.
Обновление: устранена проблема с нулевым значением из комментария.