2017-10-09 10 views
2

String.Splitメソッドを使用せずに文字列を分割したい。
可能な解決策を見つけましたhere私が使用するコードは2番目の答えからです。
これは私のコードです: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(); 
} 

ここに私の問題は、私はこの
犬猫車の人によって「」のような文字列を分割しようとすると、結果は最後にすることなく、言葉が含まれていることです(この例では)。
最後の単語の後に空白がある場合、結果は正しいです。

私は0からに私< = input.Lengthあるとき、forループ、私はinput.Lengthを== のようなものを追加しようとしました。しかし、結果はまだ最後の言葉なしでした。
何か不足していますか?

+2

forループの最後にバッファが空でないかどうかを確認する必要があります。それが空であれば、それが行われるか、またはまだ最後の文字セットが残っている – praty

+1

ループがバッファ長をチェックした後。 0以上の場合は、リストに追加します。 –

答えて

4

ループを終了した後に別の単語を追加すると、最後の単語がコレクションにフラッシュされます。あなたはそうする前に長さをチェックすることができます。コメントはありません。理由は@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(); 
関連する問題