2009-09-02 2 views

답변

4

다른 문화권을 다룰 때 foreachchar.IsWhiteSpace()을 사용하는 @Martin v. Lwwis의 대체 버전이 더 정확해야합니다.

int CountWithForeach(string para) 
{ 
    bool inWord = false; 
    int words = 0; 
    foreach (char c in para) 
    { 
     if (char.IsWhiteSpace(c)) 
     { 
      if(inWord) 
       words++; 
      inWord = false; 
      continue; 
     } 
     inWord = true; 
    } 
    if(inWord) 
     words++; 

    return words; 
} 
+0

"run-of-the-mill"은 몇 단어입니까? (생각할 것) –

+0

@ 280Z28 - 당신은 좋은 지적을 제기합니다. fyi조차 MS Word는 그것을 1 단어로 취급합니다. –

+0

무엇에 대해 "one.two three; four" – codeulike

2

: 분할을 기반으로 솔루션을 작성하는 짧은 동안 모든 문자열 객체가 필요로하는

string sentence = "This  is a sentence  with some spaces."; 
string[] words = sentence.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
int wordCount = words.Length; 
+0

분할과 관련하여 엄청난 오버 헤드가 있습니다. 문자를 통과하는 루프가 가장 빠른 경로가됩니다. OTOH, RegEx는 결과 배열이 덜 복잡한 유형 (문자열)이므로 Match 객체보다 복잡하므로 Split보다 느립니다. – richardtallent

+0

리차드의 성명서에 bullsh * t라고 부르면 실제로 분할이 실제로 더 빠르며 foreach 솔루션보다 약간 느립니다. –

1

string.Split가 시도 창조되고 나서 버려진다. 나는 명시 적 알고리즘 등

static int CountWords(string s) 
    { 
    int words = 0; 
    bool inword = false; 
    for(int i=0; i < s.Length; i++) { 
     switch(s[i]) { 
     case ' ':case '\t':case '\r':case '\n': 
      if(inword)words++; 
      inword = false; 
      break; 
     default: 
      inword = true; 
      break; 
     } 
    } 
    if(inword)words++; 
    return words; 
    } 

로하는 것이 더 효율적이라고 기대 (플러스도 추가 공백 문자를 고려할 수 있습니다).

3

, 그들이 비싼 얻을 수 있습니다 :

var input = "This is a test"; 
var count = input.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Length; 
+0

만약 당신이 그 길을가는거야, 나는 인덱스 루프와 인덱스 변수 및 string.IndexOfAny (char [], int)를 권하고 싶습니다. – bobbymcr

+0

@bobbymcr 어떻게 도움이되는지 모르겠습니다. 아마도 IndexOfAny는 단지 선형 적으로 검색합니다. –

+0

내 시스템에서 IndexOfAny 접근법이 실제로 더 빠릅니다. 선형 스캔 + 스위치 = 0.014 ~ 0.015ms; + IndexOfAny = 0.011 ~ 0.012 ms입니다. 여기 코드 : http://pastebin.ca/1551255 이것은 거의 중요하지 않지만 반드시 알고 싶었습니다! :) – bobbymcr