是否有一个组合查询字符串的实用工具?我正在寻找类似的东西:
输入:Combine("test=a&test2=b", "test3=c")
结果:"test=a&test2=b&test3=c"
输入:Combine("test=a&test2=b", "")
结果:"test=a&test2=b"
输入:Combine("", "test3=c")
结果:"test3=c"
也许有些奇怪的事情:
输入:Combine("&test=a&test2=b", "?test3=c")
结果:"test=a&test2=b&test3=c"
答案 0 :(得分:1)
我使用以下类来帮助我修改和设置查询字符串。虽然它无法解决您的确切问题,但您可以使用它并添加一些自己的功能来完成您想要的任何事情。我发现当我想修改它们时,将查询字符串视为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);
}
}
答案 1 :(得分:0)
这种方法不适合你吗?
string Combine(string s1, string s2)
{
if(string.IsNullOrEmpty(s1)) return s2;
if(string.IsNullOrEmpty(s2)) return s1;
//several '?' at start are not expected so we can use TrimStart
return s1.TrimStart('?', '&') + "&" + s2.TrimStart('?', '&');
}
答案 2 :(得分:0)
您可以将任意数量的查询字符串与
组合在一起CombineQueryStrings(params string[] segments ){
List<string> list = new List<string>();
foreach (var s in segments)
{
list.Add(s.Trim('?', '&'));
}
return string.Join("&", list.ToArray());
}
答案 3 :(得分:0)
我不确定您是否会根据您的要求获得开箱即用的解决方案。您可以使用扩展方法来实现此目的。有关扩展方法的详细信息,请参阅:Extension Methods
答案 4 :(得分:0)
这是一个.NET 4.0解决方案,因为正在使用Join
重载并且它不是完全开箱即用的。但是,它使用.NET System.Web.HttpUtility
来正确解析查询字符串。
var r1 = HttpUtility.ParseQueryString("?test3=c");
var r2 = HttpUtility.ParseQueryString("");
var r3 = HttpUtility.ParseQueryString("test2=d");
var total = new NameValueCollection();
total.Add(r1);
total.Add(r2);
total.Add(r3);
var qs = String.Join(
"&",
total.AllKeys.Select(key => key + "=" + total[key]));
Console.WriteLine(qs);
输出:
// test3=c&test2=d