2009-10-12 2 views
3

문자열을 N 번 연결하려는 경우 어떤 방법을 선호합니까?N 회 반복에 사용할 문자열 연결 방법은 무엇입니까?

예로 들어이 코드를 가지고 :

public static string Repeat(this string instance, int times) 
{ 
     var result = string.Empty; 

     for (int i = 0; i < times; i++) 
      result += instance; 

     return result; 
} 

이 방법은 5, 내가 사용하는 것을 선호한다 무엇 방법 5000으로 설정 "배"로 호출 할 수 있습니다?

문자열. 조인? Stringbuilder? 그냥 표준 문자열이야. 콩콩?

상용 라이브러리에서 비슷한 기능이 구현 될 것이므로 실제로이 작업을 수행하는 데 "최적의"방법이 필요합니다.

답변

8
public static string Repeat(this string instance, int times) 
    { 
     if (times == 1 || string.IsNullOrEmpty(instance)) return instance; 
     if (times == 0) return ""; 
     if (times < 0) throw new ArgumentOutOfRangeException("times"); 
     StringBuilder sb = new StringBuilder(instance.Length * times); 
     for (int i = 0; i < times; i++) 
      sb.Append(instance); 
     return sb.ToString(); 
    } 
+0

감사합니다. 좋은 점을 입증 해 주셔서 감사합니다. – alexn

+1

줄 4에서 string.Empty를 반환하지 않는 이유는 무엇입니까? –

+0

""string.Empty, MSDN에서와 같이 : [이 필드의 값은 길이가 0 인 문자열입니다. ""] [1]. [1] : http://msdn.microsoft.com/en-us/library/system.string.empty.aspx –

5

물론입니다. 문자열을 조인 할 때마다 새 객체를 만들지 않기 때문에 빠른 문자열 조인 작업을위한 것입니다.

자세한 내용은 here을 참조하십시오.

2

StringBuilder.

"result + = result;"

은 문자열을 변경할 수 없으므로 할당 할 때마다 매번 새로운 문자열을 만들고 변수에 새 문자열을 할당합니다.

StringBuilder로 이동하십시오.

2

한 가지 방법이 다른 방법보다 빠르다고 가정하지 마십시오. 두 가지 방법의 성능을 항상 측정하고 결정해야합니다.

놀랍게도 적은 수의 반복에서는 문자열 작성기를 사용하는 것보다 표준 문자열 연결 (result + = string)이 더 빠릅니다.

반복 수가 항상 동일 할 경우 (예 : 항상 50 반복), 다른 방법을 사용하여 성능 측정을하는 것이 좋습니다.

당신은 정말는 영리 반복의 수에 대해 성능 측정을 만들고 싶어 당신은 하나 개의 방법이 방법으로 그 임계 값을 다른 것보다 더 빠르고 하드 코드 인 '크로스 오버 포인트'찾아 낼 수있는 경우 :

if(iterations < 30) 
{ 
    CopyWithConcatenation(); 
} 
else 
{ 
    CopyWithStringBuilder(); 
} 

정확한 성능 크로스 오버 포인트는 코드의 세부 사항에 따라 달라지며 성능 측정을하지 않고도 성능을 파악할 수 없습니다.

좀 더 복잡하게하기 위해 StringBuilder는 문자열 연결 (더 ​​임시 인스턴스를 생성하는)이라는 "깔끔한"메모리 관리 기능을 제공하므로 문자열 루프 외부의 전반적인 성능에 영향을 미칠 수 있습니다 (예 : 다음 번 Garbage 수집가 실행).

어떻게 진행했는지 알려주십시오.

+0

훌륭한 통찰력, 감사합니다. – HXCaine