不使用String.Split方法拆分字符串不会返回正确的结果

问题描述:

我想拆分字符串而不使用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(); 
} 

我在这里的问题是,当我试图将一个字符串分解这样
狗猫汽车人通过“”,结果包含单词没有最后一个(在这个例子中 - )。
如果在最后一个单词后有一个空格,结果是正确的。

我尝试添加像我== input.Length当for循环是从0到我< = input.Length。但结果仍然没有硬道理。
我错过了什么吗?

+2

您应该检查for循环结束时buffer是否为空。如果它是空的,则完成,或者仍有最后一组字符。 – praty

+1

循环检查缓冲区长度。如果它多于0,则将其添加到列表中。 –

退出循环后再添加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

这里是你在错过了什么你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();