2008-10-29 8 views
1

나는 다음과 같은 의도적으로 사소한 기능을 가지고 :인덱싱

으로 인덱스에 모두 StringBuilder이 변환과 문자의 일부를 대체하는 비효율적 인 것으로 보인다
void ReplaceSome(ref string text) 
{ 
    StringBuilder sb = new StringBuilder(text); 
    sb[5] = 'a'; 
    text = sb.ToString(); 
} 

만 ref'd 매개 변수로 다시 복사하십시오. L-Value로 텍스트 매개 변수로 직접 인덱싱 할 수 있습니까?

또는 어떻게 개선 할 수 있습니까?

답변

3

C#을 문자열은 수정할 수 없습니다 것을 의미한다 "불변"입니다. 문자열이 있고 비슷하지만 다른 문자열을 원할 경우 새 문자열을 만들어야합니다. 위에서와 같이 StringBuilder를 사용하는 것은 아마도 모든 방법만큼 쉬운 방법 일 것입니다.

-1

이 방법이 더 효율적인지는 모르지만 작동합니다. 어느 쪽이든, 변경이 끝날 때마다 문자열을 다시 작성할 필요가 있습니다.

string test = "hello world"; 
    Console.WriteLine(test); 

    test = test.Remove(5, 1); 
    test = test.Insert(5, "z"); 

    Console.WriteLine(test); 

아니면 더 간결하려는 경우 :

string test = "hello world".Remove(5, 1).Insert(5, "z"); 
+0

... 왜 누군가가이 downmod습니까? 나를 똑바로 세워! –

+0

나 아니었지만 내 추측에 따르면 그들은 하나의 char 교체 대신에 두 가지 작업을하는 것을 좋아하지 않았다. downmodder가 System.String을 사용하여이 작업을 수행 할 수 없다는 사실을 알지 못했을 수 있습니다. 또는 StringBuilder 방식을 크게 선호 할 수도 있습니다. – Alan

-1

StringBuilder 솔루션과 크게 다르지 않지만 Remove(), Insert() 대답보다 약간 간결합니다.

3

리플렉터 및 디 컴파일 된 IL으로 무장 - 순수한 LOC 기준으로 StringBuilder 방식이 가장 효율적입니다. 예를 들어 IL 호출을 추적하면 StringBuilder가 String :: Remove 및 String :: Insert 등의 IL 호출을 호출합니다.

각 접근법의 메모리 오버 헤드를 테스트 할 수는 없지만 반사경 결과가있는 행 - StringBuilder 방식이 가장 좋습니다.

나는 사실 모두 StringBuilder도 전반적으로 도움이 될 생성자

StringBuilder sb = new StringBuilder(text); 

를 사용하여 설정 한 메모리 크기가 생각합니다. 다른 언급처럼, 효율성 대 가독성에 내려 와서

... 내가 진정으로 궁금