2017-10-09 3 views
2

String.Split 메서드를 사용하지 않고 문자열을 분할하고 싶습니다.
가능한 해결책을 찾았습니다 here. 내가 사용하는 코드는 두 번째 대답에서 나온 것입니다.
이 내 코드입니다 :String.Split 메서드를 사용하지 않고 문자열을 분할하면 올바른 결과가 반환되지 않습니다.

public string[] SplitString(string input, char delimiter) 
{ 
    List<String> parts = new List<String>(); 
    StringBuilder buff = new StringBuilder(); 

    for (int i = 0; i < input.Length; i++) 
    { 
     if (input[i] == delimiter) 
     { 
      parts.Add(buff.ToString()); 
      buff.Clear(); 
     } 
     else 
     { 
      buff.Append(input[i]); 
     } 
    } 
    return parts.ToArray(); 
} 

여기 내 문제는 내가이
개 고양이 자동차 사람 에 의해 "" 같은 문자열을 분할 할 때, 결과는 마지막없이 단어가 포함되어 있다는 것입니다 하나 (이 예에서는 - 사람).
마지막 단어 뒤에 공백이 있으면 결과가 정확합니다.

나는 for 루프는 0에서 내가 < = input.Length에있을 때 처럼 == input.Length 뭔가를 추가했습니다. 그러나 결과는 여전히 마지막 단어가 없었습니다.
내가 뭔가를 놓친 건가요?

+2

for 루프의 끝에서 버퍼가 비어 있지 않은지 확인해야합니다. 비어있는 경우 완료되거나, 마지막 문자 세트가 남았습니다. – praty

+1

루프가 버퍼 길이를 확인한 후. 0 이상인 경우 목록에 추가하십시오. –

답변

4

루프를 종료 한 후 parts.Add(buff.ToString());을 추가하면 컬렉션에 마지막 단어가 플러시됩니다. 그렇게하기 전에 길이를 확인할 수 있으며, @hvd로 이유를 설명 할 수 있습니다.

if(buff.Length != 0) 
{ 
    parts.Add(buff.ToString()); 
} 
return parts.ToArray(); 

, 대신이 될 것 StringBuilder를 사용하는 또 다른 방법 :

public static string[] SplitString(string input, char delimiter) 
{ 
    List<String> parts = new List<String>(); 
    int start = 0; 
    for(int i = 0; i < input.Length; i++) 
    { 
     if(input[i] == delimiter) 
     { 
      parts.Add(input.Substring(start, i - start)); 
      start = i + 1; 
     } 
    } 
    parts.Add(input.Substring(start, input.Length - start)); 
    return parts.ToArray(); 
} 

또는 yield return을 사용하고 IEnumerable<string> 반환 :

여기
public static IEnumerable<string> SplitString(string input, char delimiter) 
{ 
    int start = 0; 
    for(int i = 0; i < input.Length; i++) 
    { 
     if(input[i] == delimiter) 
     { 
      yield return input.Substring(start, i - start); 
      start = i + 1; 
     } 
    } 
    yield return input.Substring(start, input.Length - start); 
} 
+2

"하기 전에 버퍼가 비어 있지 않은지 확인하십시오"- 아니요, 확인하지 마십시오. 선행 공백 또는 연속 내부 공백이있는 경우 OP는 빈 문자열을 얻습니다. 일관성을 위해 OP는 공백이있는 경우 공 문자열을 가져와야합니다. – hvd

0

은 당신이 무엇을 놓치고 있는지 당신의 for 루프 후 코드 :

for (int i = 0; i < input.Length; i++) 
    { 
     if (input[i] == delimiter) 
     { 
      parts.Add(buff.ToString()); 
      buff.Clear(); 
     } 
     else 
     { 
      buff.Append(input[i]); 
     } 
    } 

    // This you need to add 
    if (!string.IsNullOrEmpty(buff.ToString())) 
    { 
     parts.Add(buff.ToString()); 
    } 

    return parts.ToArray();