문제

keyvaluepair를 사용하여 구성하는 문자열은 다음과 같습니다."이름1=v1&이름2=v2&이름3=v3"

내가 뭘 하고 있는지:

var sb = new StringBuilder();

foreach (var name in nameValues)
{
            sb.AppendFormat("{0}={1}&", name.Key, name.Value);
 } 

//remove last '&' sign, this is what i think is ugly
sb.ToString().Remove(lastIndex);

'&' 기호의 마지막 제거 문을 피하는 우아한 방법이 있습니까?

도움이 되었습니까?

해결책

var joined =
    String.Join("&", nameValues.Select(n => n.Key + "=" + n.Value).ToArray());

하나의 큰 문자열로 연결하지 않는다는 점을 고려하면(많은 작은 문자열을 생성하고 있음) 이 경우 연결로 인해 성능 저하가 발생하지 않습니다.그리고 .NET 문자열에서는 어쨌든 길이 접두사가 붙으므로 전체 연결 성능 ​​문제는 C보다 관련성이 적습니다.String.Join()은 StringBuilder보다 매우 빠릅니다.

TLDR: 사용 String.Join()

다른 팁

여기를 참조하십시오. C#에서 URL 용 쿼리 문자열을 빌드하는 방법?; 인용 :

private string ToQueryString(NameValueCollection nvc)
{
    return "?" + 
        string.Join("&", 
            Array.ConvertAll(
                nvc.AllKeys, 
                key => String.Format("{0}={1}", HttpUtility.UrlEncode(key),
                HttpUtility.UrlEncode(nvc[key]))));
}
foreach (var name in nameValues)
    {
        if (sb.Length > 0) sb.Append("&");
                sb.AppendFormat("{0}={1}", name.Key, name.Value);
     }

필요할 때 "&"를 추가하면 끝에서 제거하지 마십시오.

다음은 때때로 사용한 또 다른 방법입니다.

var sb = new StringBuilder();
string prefix = "";
foreach (var name in nameValues)
{
    sb.Append(prefix);
    prefix = "&";
    sb.AppendFormat("{0}={1}", name.Key, name.Value);
}

그것은 조건부 테스트를 사용하지 않고 첫 번째 쌍 이외의 모든 쌍보다 선불의 방법 일뿐입니다.

원래 아이디어를 다듬는 아이디어를 사용하려면 StringBuilder 그건 그렇고, 다음 코드를 대신 제안합니다.

sb.Length--; // Remove the last character
return sb.ToString();

나는 이것을 사용하는 경향이 있으며, 당신이 길이 속성을 줄이면서 스트링 빌더를 자울 수 있다는 사실을 사용합니다.

var sb = new StringBuilder();

foreach (var name in nameValues)
{
    sb.AppendFormat("{0}={1}&", name.Key, name.Value);
} 

if (sb.Length > 0) sb.Length--;

적어도 당신은 제거 할 수 있습니다 & 전에 서명하십시오 ToString() 전화로 전화하십시오 --sb.Length;

var sb = new StringBuilder();

sb.AppendFormat("{0}={1}", nameValues[0].Key, nameValues[0].Value);

for (int i = 1; i < nameValues.Count; i++)
{
        sb.AppendFormat("&{0}={1}", nameValues[i].Key, nameValues[i].Value);
} 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top