1. ホーム
  2. c#

[解決済み] C#でURLのクエリ文字列を作成するには?

2022-03-18 22:26:31

質問

コードからWebリソースを呼び出す際の一般的なタスクは、必要なすべてのパラメータを含むクエリ文字列を構築することです。ロケットサイエンスではありませんが、クエリ文字列の前に & が最初のパラメータでない場合、パラメータのエンコーディングなど。

それを行うためのコードは非常にシンプルですが、少し面倒です。

StringBuilder SB = new StringBuilder();
if (NeedsToAddParameter A) 
{ 
  SB.Append("A="); SB.Append(HttpUtility.UrlEncode("TheValueOfA")); 
}

if (NeedsToAddParameter B) 
{
  if (SB.Length>0) SB.Append("&"); 
  SB.Append("B="); SB.Append(HttpUtility.UrlEncode("TheValueOfB")); }
}

このような一般的なタスクは、よりエレガントで読みやすくするユーティリティクラスが存在すると期待されます。MSDNに目を通したところ、そのようなクラスは見つかりませんでしたが、そこで次のような疑問がわきました。

上記のことを行うための最もエレガントでクリーンな方法は何ですか?

解決方法は?

フードの下を見ると、QueryStringプロパティはNameValueCollectionになっています。私が同様のことを行ったとき、私は通常、シリアライズとデシリアライズに興味があったので、私の提案は、NameValueCollectionを構築して、それを渡すことです。

using System.Linq;
using System.Web;
using System.Collections.Specialized;

private string ToQueryString(NameValueCollection nvc)
{
    var array = (
        from key in nvc.AllKeys
        from value in nvc.GetValues(key)
            select string.Format(
                "{0}={1}",
                HttpUtility.UrlEncode(key),
                HttpUtility.UrlEncode(value))
        ).ToArray();
    return "?" + string.Join("&", array);
}

LINQでこれを行うには、超エレガントな方法もあるのでしょうね...。