나는 이것에 대해 어떻게 해야할지 잘 모릅니다. 지금은 문자열의 단어 수를 얻기 위해 공백을 계산하지만 이중 공간이 있으면 단어 수가 부정확 할 것입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?Cure에서 문자열 수를 얻는 확실한 방법은 무엇입니까?
이 나를 위해 작동하는 것 같다답변
다른 문화권을 다룰 때 foreach
및 char.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;
}
: 분할을 기반으로 솔루션을 작성하는 짧은 동안 모든 문자열 객체가 필요로하는
string sentence = "This is a sentence with some spaces.";
string[] words = sentence.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
int wordCount = words.Length;
분할과 관련하여 엄청난 오버 헤드가 있습니다. 문자를 통과하는 루프가 가장 빠른 경로가됩니다. OTOH, RegEx는 결과 배열이 덜 복잡한 유형 (문자열)이므로 Match 객체보다 복잡하므로 Split보다 느립니다. – richardtallent
리차드의 성명서에 bullsh * t라고 부르면 실제로 분할이 실제로 더 빠르며 foreach 솔루션보다 약간 느립니다. –
이 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;
}
로하는 것이 더 효율적이라고 기대 (플러스도 추가 공백 문자를 고려할 수 있습니다).
, 그들이 비싼 얻을 수 있습니다 :
var input = "This is a test";
var count = input.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Length;
만약 당신이 그 길을가는거야, 나는 인덱스 루프와 인덱스 변수 및 string.IndexOfAny (char [], int)를 권하고 싶습니다. – bobbymcr
@bobbymcr 어떻게 도움이되는지 모르겠습니다. 아마도 IndexOfAny는 단지 선형 적으로 검색합니다. –
내 시스템에서 IndexOfAny 접근법이 실제로 더 빠릅니다. 선형 스캔 + 스위치 = 0.014 ~ 0.015ms; + IndexOfAny = 0.011 ~ 0.012 ms입니다. 여기 코드 : http://pastebin.ca/1551255 이것은 거의 중요하지 않지만 반드시 알고 싶었습니다! :) – bobbymcr
"run-of-the-mill"은 몇 단어입니까? (생각할 것) –
@ 280Z28 - 당신은 좋은 지적을 제기합니다. fyi조차 MS Word는 그것을 1 단어로 취급합니다. –
무엇에 대해 "one.two three; four" – codeulike