web-dev-qa-db-ja.com

System.Webに依存しないHttpUtility.ParseQueryStringの代替?

キーと値をヘルパークラスに追加するだけでURLクエリ文字列を作成し、これをURLクエリとして返すようにしたいと考えています。私はこれが次のようにできることを知っています:

var queryBuilder= HttpUtility.ParseQueryString("http://baseurl.com/?");
queryBuilder.Add("Key", "Value");
string url =  queryBuilder.ToString();

それはまさに私が求めている行動です。ただし、このクラスは有名なSystem.Webに存在するため、ライブラリ全体を持ち込むことはしません。どこかに代替案はありますか?

17
MartinM

例で使用しているHttpValueCollectionは実際には簡単なものではなく、System.Webライブラリの他の多くの部分を利用して、有効なhttp URLをエンコードします。必要なパーツのソースを抽出することは可能ですが、想像以上にかなりカスケードになる可能性があります。

それを理解していて、キーと値が正しくエンコードされていることをすでに確認しているので単純なプリミティブが必要な場合は、自分でロールするだけで簡単に実行できます。

以下は、NameValueCollectionへの拡張メソッドの形式の例です。

public static class QueryExtensions
{
    public static string ToQueryString(this NameValueCollection nvc)
    {
        IEnumerable<string> segments = from key in nvc.AllKeys
                                       from value in nvc.GetValues(key)
                                       select string.Format("{0}={1}", 
                                       WebUtility.UrlEncode(key),
                                       WebUtility.UrlEncode(value));
        return "?" + string.Join("&", segments);
    }
}

この拡張機能を使用して、次のようなクエリ文字列を作成できます。

// Initialise the collection with values.
var values = new NameValueCollection {{"Key1", "Value1"}, {"Key2", "Value2"}};

// Or use the Add method, if you prefer.
values.Add("Key3", "Value3");

// Build a Uri using the extension method.
var url = new Uri("http://baseurl.com/" + values.ToQueryString());
6
Adam Rhodes