2010-04-28 2 views
2

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

Вход: 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"

ответ

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); 
    } 
} 
+0

Не забыли ли вы URL-кодировать символы? – SergGr

+0

хорошо пункт! Мне всегда нравится, когда размещение кода здесь делает его лучше. – tster

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

кажется, что вы не обрабатываете 'Комбинат («»,«TEST3 = с»)' случай правильно – SergGr

0

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

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 
+0

я не думаю, что это хорошая идея, как вы декодировать URL-кодированных символов в HttpUtility .ParseQueryString и не кодировать их при присоединении строк назад. – SergGr

+0

@iPhone beginner, образец кода - это просто демонстрация способа достижения желаемого OP. Он не предназначен для полного решения. В качестве дополнительной заметки класс 'HttpUtility' также имеет методы кодирования URL-строки. –

+0

В любом случае, зачем вам вообще использовать HttpUtility? То, что требуется OP, - это просто правильная конкатенация строк с помощью нескольких трюков. Я не вижу причины разбирать строки, декодировать их, а затем кодировать и присоединяться снова. ИМХО, это слишком много работы и слишком много мест, чтобы совершить ошибку. – SergGr

Смежные вопросы