2011-12-06 4 views
2

가장 효율적인 방법은 무엇입니까? 더 좋은 방법은 있습니까?문자열의 첫 번째 문자를 결정하는 가장 효율적인 방법은 무엇입니까?

this.returnList[i].Title[0].ToString() 

또는

this.returnList[i].Title.Substring(0, 1) 
+11

중요합니까? 성능 문제가 있습니까? 벤치 마크에서 뭐라고 말 했나요? – Oded

+0

코드를 다시 읽을 때 가장 이해하기 쉬운 코드를 사용합니다. – hspain

+0

그리고 호기심이 있다면, 그것은 공정합니다. 측정하는 것은 간단합니다. – codekaizen

답변

3

그들은 매우 빠르게 두 위치 :

숯불 지수

var sample = "sample"; 
var clock = new Stopwatch(); 
for (var i = 0; i < 10; i++) 
{ 
    clock.Start(); 
    for (var j = 0; j < 10000000; j++) 
    { 
     var first = sample[0].ToString(); 
    } 
    clock.Stop(); 
    Console.Write(clock.Elapsed); 
    clock.Reset(); 
} 

// Results 
00:00:00.2012243 
00:00:00.2207168 
00:00:00.2184807 
00:00:00.2258847 
00:00:00.2296456 
00:00:00.2261465 
00:00:00.2120131 
00:00:00.2221702 
00:00:00.2346083 
00:00:00.2330840 

하위 문자열

var sample = "sample"; 
var clock = new Stopwatch(); 
for (var i = 0; i < 10; i++) 
{ 
    clock.Start(); 
    for (var j = 0; j < 10000000; j++) 
    { 
     var first = sample.Substring(0, 1); 
    } 
    clock.Stop(); 
    Console.Write(clock.Elapsed); 
    clock.Reset(); 
} 

// Results 
00:00:00.3268155 
00:00:00.3337077 
00:00:00.3439908 
00:00:00.3273090 
00:00:00.3380794 
00:00:00.3400650 
00:00:00.3280275 
00:00:00.3333719 
00:00:00.3295982 
00:00:00.3368425 
나는 또한 문자 인덱스를 사용하여 깨끗한 방법입니다 BrokenGlass에 동의

그것을 쓰는 중. 게다가 10 조 시간이면 훨씬 빨라집니다!

+0

그런 명확한 방법으로 차이점을 설명해 주셔서 감사합니다! – slinzerthegod

+1

@slinzerthegod 문제가 없습니다. LINQPad 다운로드 http://www.linqpad.net/ 무료이며 절대적으로 필요합니다. C# 코드를 빠르고 쉽게 테스트하고 테스트 할 수 있습니다. 또한 질문에 만족스럽게 답변 한 경우 대답을 확인하십시오. –

1
나는 그것이 현명한 많은 효율성을 중요 하겠지만, 첫 번째 문자를 반환 내 의견에 명확하게, 더 관용적 따라서 더 유지 관리 방법은 인덱스를 사용하여 생각하지 않습니다

연산자 :

char c = returnList[i].Title[0]; 

여기에는 적어도 하나의 문자가 있다고 가정합니다. 주어진 문자가 아닌 경우이를 확인해야합니다.

0

성능이 거의 동일해야합니다.

작업의 값 비싼 부분은 문자열을 만드는 것이고 더 효율적인 방법은 없습니다.

가능한 경우가 아니면 모든 가능한 문자에 대한 문자열을 미리 만들고 사전에 저장하려고하지만 사소한 작업을 위해 많은 메모리를 사용합니다.

0

returnList[I].Title[0]은 새로운 string을 만들 필요가 없으므로 원래의 문자에서 문자에 액세스하는 것보다 훨씬 빠릅니다. 물론 문자열이 비어 있으면 예외가 발생하므로 먼저 확인해야합니다.

일반적으로 고정 길이가 1 인 문자열은 절대 사용하지 마십시오. 즉, char이 사용됩니다.

성능 차이는 문제가되지 않지만 더 나은 가독성은 분명히 있습니다.

+0

사실, 문자열을 다시 문자열로 변환 할 때 새로운 문자열을 만들어야합니다. ('char.ToString()') –

+0

@Charles 왜 문자를 비교하지 않으시겠습니까? 'returnList [I]. 제목 [0] = 'A'c' –

+0

@Charles : 왜 숯을 다시 문자열로 변환하고 싶습니까? 고정 길이의 1 문자열을 돌아 다니는 것은 의미가 없습니다. – Falanwe

2

코드에 "첫 번째 문자"가 의미하는 것과 무엇이 returnList에 포함되어 있는지에 따라 문제가 발생할 수있는 큰 허점이 있습니다.

C 번호 문자열은 UTF-16, 가변 길이 인코딩을 포함하고 returnList 문자열의 배열 인 경우, returnList[i]은 유니 포인트의 하나 char 수 있습니다. 당신은 문자열의 첫 번째 유니 코드 자소 반환 할 경우

string s = returnList[i].Title; 
if (string.IsNullOrEmpty(s)) 
    return s; 

int charsInGlyph = char.IsSurrogatePair(s, 0) ? 2 : 1; 
return s.Substring(0, charsInGlyph); 

당신은 BOM을, 태그 및 결합 문자와 같은 문제로 실행 할 수 있습니다; 이들은 모두 유효한 문자이지만 사용자에게 표시되면 의미가 없습니다.

문자가 아닌 유니 코드 포인트 또는 문자를 원한다면 문자열을 사용해야합니다. 유니 코드 글자체는 하나 이상의 문자 일 수 있습니다.

관련 문제