Утилита для объединения строк запросов? - PullRequest
2 голосов
/ 28 апреля 2010

Есть ли утилита для объединения строк запросов? Я ищу что-то вроде:

Ввод: 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 ]

1 голос
/ 28 апреля 2010

Я использую следующий класс, чтобы помочь мне изменить и задать строки запроса. Хотя это не решает вашу конкретную проблему, вы можете использовать ее и добавить еще несколько собственных функций, чтобы выполнить все, что вы хотите. Мне просто удобно обрабатывать строки запроса как 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);
    }
}
0 голосов
/ 28 апреля 2010

Это решение для .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
0 голосов
/ 28 апреля 2010

Вы можете объединить любое количество строк запроса с этим

CombineQueryStrings(params string[] segments ){
    List<string> list = new List<string>();
    foreach (var s in segments)
    {
        list.Add(s.Trim('?', '&'));
    }
    return string.Join("&", list.ToArray());
}
0 голосов
/ 28 апреля 2010

Я не уверен, что вы получите готовое решение для вашего требования. Вы можете использовать метод расширения как способ достижения этого. Для получения дополнительной информации о методе расширения см .: Методы расширения

0 голосов
/ 28 апреля 2010

Не подойдет ли вам такой метод?

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('?', '&');
}
...