不使用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。但结果仍然没有硬道理。
我错过了什么吗?
答
退出循环后再添加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();
您应该检查for循环结束时buffer是否为空。如果它是空的,则完成,或者仍有最后一组字符。 – praty
循环检查缓冲区长度。如果它多于0,则将其添加到列表中。 –