不使用String.Split方法分割字符串会导致结果不正确。

3

我想在不使用 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();
}

我的问题在于当我尝试用" "分割这个字符串
dog cat car person时,结果包含没有最后一个单词的单词(在这个例子中是person)。
如果在最后一个单词之后有一个空格,结果就正确了。
我尝试在for循环从0到i <= input.Length时添加i == input.Length。但结果仍然没有最后一个单词。
我错过了什么吗?

2
在 for 循环结束时,您应该检查缓冲区是否为空。如果它为空,则表示已完成;否则,仍然有一组最后的字符剩余。 - praty
1
循环结束后检查缓冲区长度。如果长度大于0,则将其添加到列表中。 - Zohar Peled
2个回答

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也应该得到空字符串。 - user743382

1
以下是您在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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接