IT TIP

C #에서 쿼리 문자열을 사전으로 변환하는 가장 좋은 방법

itqueen 2020. 12. 28. 22:18
반응형

C #에서 쿼리 문자열을 사전으로 변환하는 가장 좋은 방법


HTTP GET 요청의 쿼리 문자열을 사전으로 변환하고 다시 다시 변환하는 가장 간단한 방법을 찾고 있습니다.

쿼리가 사전 형식이면 쿼리에 대한 다양한 조작을 수행하는 것이 더 쉽다고 생각하지만 변환을 수행하기위한 코드가 많은 것 같습니다. 권장되는 방법이 있습니까?


HttpUtility.ParseQueryString()쿼리 문자열을 NameValueCollection객체 로 구문 분석 하고 후자를로 변환하는 IDictionary<string, string>것은 간단한 foreach. 그러나 NameValueCollection인덱서 가 있으므로 불필요 할 수 있으므로 사전과 매우 유사하게 작동합니다.


일반적으로하는 방법은 다음과 같습니다.

   Dictionary<string, string> parameters = HttpContext.Current.Request.QueryString.Keys.Cast<string>()
                .ToDictionary(k => k, v => HttpContext.Current.Request.QueryString[v]);

어때요 HttpUtility.ParseQueryString?

System.Web.dll에 대한 참조를 추가하기 만하면됩니다.


모노 호환 솔루션을 위해이 작업을 수행해야했습니다.

Regex.Matches(queryString, "([^?=&]+)(=([^&]*))?").Cast<Match>().ToDictionary(x => x.Groups[1].Value, x => x.Groups[3].Value)

나는 Jon Canning의 대답 의 간결함을 좋아 하지만 다양성을 위해 그의 대답에 대한 또 다른 대안이 있습니다 HttpUtility.ParseQueryString(). 이는 유틸리티 가 부족한 Windows Phone 8과 같은 제한된 환경에서도 작동 합니다.

    public static Dictionary<string, string> ParseQueryString(String query)
    {
        Dictionary<String, String> queryDict = new Dictionary<string, string>();
        foreach (String token in query.TrimStart(new char[] { '?' }).Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries))
        {
            string[] parts = token.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
            if (parts.Length == 2)
                queryDict[parts[0].Trim()] = HttpUtility.UrlDecode(parts[1]).Trim();
            else
                queryDict[parts[0].Trim()] = "";
        }
        return queryDict;
    }

실제로 위의 솔루션과 같이 URL 인코딩 값 디코딩을 처리하는 Canning의 답변에 대한 유용한 개선 사항은 다음과 같습니다.

    public static Dictionary<string, string> ParseQueryString2(String query)
    {
       return Regex.Matches(query, "([^?=&]+)(=([^&]*))?").Cast<Match>().ToDictionary(x => x.Groups[1].Value, x => HttpUtility.UrlDecode( x.Groups[3].Value ));
    }

Sean과 동일하지만 Linq (및 복사하여 붙여 넣을 수있는 함수)를 사용합니다.

public static Dictionary<string, string> ParseQueryString(string queryString)
{
   var nvc = HttpUtility.ParseQueryString(queryString);
   return nvc.AllKeys.ToDictionary(k => k, k => nvc[k]);
}

또한 질문은 쿼리 문자열로 되 돌리는 방법을 물었습니다.

public static string CreateQueryString(Dictionary<string, string> parameters)
{
   return string.Join("&", parameters.Select(kvp => 
      string.Format("{0}={1}", kvp.Key, HttpUtility.UrlEncode(kvp.Value))));
}

HttpUtility없는 라이너 1 개

var dictionary = query.Replace("?", "").Split('&').ToDictionary(x => x.Split('=')[0], x => x.Split('=')[1]);

이를 수행하는 또 다른 방법 :

NameValueCollection nvcData = HttpUtility.ParseQueryString(queryString);
Dictionary<string, string> dictData = new Dictionary<string, string>(nvcData.Count);
foreach (string key in nvcData.AllKeys)
{
    dictData.Add(key, nvcData.Get(key));
}

ASP.NET Core에서 ParseQuery를 사용 합니다 .

var query = HttpContext.Request.QueryString.Value;
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);

가장 간단합니다.

Dictionary<string, string> parameters = new Dictionary<string, string>();

for (int i = 0; i < context.Request.QueryString.Count; i++)
{
    parameters.Add(context.Request.QueryString.GetKey(i), context.Request.QueryString[i]);
}

HttpContext.Request.QueryString을 Dictionary <> 로 변환 하는 대신

HttpContext.Request.Query which already is a Dictionary<string, StringValues>

ReferenceURL : https://stackoverflow.com/questions/776107/best-way-to-convert-query-string-to-dictionary-in-c-sharp

반응형