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
'developer tip' 카테고리의 다른 글
C #에서 'String.Contains ( "term")'을 나타내는 식 트리를 만들려면 어떻게해야합니까? (0) | 2020.12.27 |
---|---|
.NET-반영된 PropertyInfo의 기본값 가져 오기 (0) | 2020.12.27 |
목록의 이동 평균 계산 (0) | 2020.12.27 |
Android : SlidingDrawer의 높이를 wrap_content로 설정할 수 있습니까? (0) | 2020.12.27 |
Linux에서 MongoDB를 가져와 원격 연결 수신 (0) | 2020.12.27 |