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

时间:2017-10-09 10:30:36

标签: c# string split

我想在不使用 String.Split 方法的情况下拆分字符串 我找到了一个可能的解决方案here。我使用的代码来自第二个答案 这是我的代码:

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();
}

我的问题是,当我尝试拆分像这样的字符串时 通过“” 狗猫车人,结果包含没有最后一个的单词(在此示例中为 person )。
如果在最后一个单词之后有一个空格,则结果是正确的。

当for循环从0到 i&lt; = input.Length 时,我尝试添加类似 i == input.Length 的内容。但结果仍然没有说句 我错过了什么吗?

2 个答案:

答案 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);
}

答案 1 :(得分: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();