结合查询字符串的效用?

时间:2010-04-28 14:42:27

标签: .net asp.net query-string

是否有一个组合查询字符串的实用工具?我正在寻找类似的东西:

输入: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"

5 个答案:

答案 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