代码之家  ›  专栏  ›  技术社区  ›  adam0101

用于组合查询字符串的实用程序?

  •  2
  • adam0101  · 技术社区  · 14 年前

    有没有一个实用程序可以组合查询字符串?我在找类似的东西:

    输入: 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") 结果: “测试=a&test2=b&test3=c”

    5 回复  |  直到 14 年前
        1
  •  1
  •   tster    14 年前

    我使用下面的类来帮助我修改和设置查询字符串。虽然它不能解决您的确切问题,但是您可以使用它并添加一些您自己的功能来完成您想要的任何事情。当我想修改查询字符串时,我发现将其作为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);
        }
    }
    
        2
  •  0
  •   SergGr    14 年前

    这种方法对你有用吗?

    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('?', '&');
    }
    
        3
  •  0
  •   Draco Ater    14 年前

    您可以将任意数量的查询字符串与之组合

    CombineQueryStrings(params string[] segments ){
        List<string> list = new List<string>();
        foreach (var s in segments)
        {
            list.Add(s.Trim('?', '&'));
        }
        return string.Join("&", list.ToArray());
    }
    
        4
  •  0
  •   Amit Rai Sharma    14 年前

    我不确定你是否会得到一个现成的解决方案来满足你的要求。您可以使用扩展方法来实现这一点。有关扩展方法的详细信息,请参阅: Extension Methods

        5
  •  0
  •   João Angelo    14 年前

    这是一个.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