用于在大写字符上拆分字符串的自定义函数不能按预期工作

时间:2012-11-19 09:01:52

标签: c# algorithm

public static string UpperCaseStringSplitter(string stringToSplit)
{
    var stringBuilder = new StringBuilder();
    foreach (char c in stringToSplit)
    {
        if (Char.IsUpper(c) && stringToSplit.IndexOf(c) > 0)
            stringBuilder.Append(" " + c);
        else
            stringBuilder.Append(c);
    }
    return stringBuilder.ToString();
}

如果我传递这样的字符串:

TestSrak

输出是预期的:"Test Srak"

但是当有两个相同的字母,其中一个是小写字母而另一个是大写字母彼此相邻时,分割不会发生:

例如,如果输入为:

TestTruck

输出也是TestTruck。你能告诉我问题在哪里,我该如何解决?谢谢!

4 个答案:

答案 0 :(得分:3)

问题是这个

stringToSplit.IndexOf(c) > 0)

"TestTruck"中,第一个字母(索引== 0)也是T,因此不会输入if

相反,我会使用for-loop并检查当前的char是否是第一个,然后你可以跳过拆分:

for(int i=0; i < stringToSplit.Length; i++)
{
    if (i > 0 && Char.IsUpper(stringToSplit[i]))
        stringBuilder.Append(" ").Append(stringToSplit[i]);
    else
        stringBuilder.Append(stringToSplit[i]);
}

答案 1 :(得分:3)

试试这个:

public static string UpperCaseStringSplitter(string stringToSplit)
{
    var stringBuilder = new StringBuilder();
    for(int i = 0; i <stringToSplit.Length; i++)
    {
        char c = stringToSplit[i];

        if (Char.IsUpper(c) && i > 0)
            stringBuilder.Append(" " + c);
        else
            stringBuilder.Append(c);
    }
    return stringBuilder.ToString();
}

答案 2 :(得分:1)

Tim Schmelter的answer确定了您的代码问题,但是如果您尝试在字符串中的大写字符前面添加一个空格,那么您可以尝试以下(使用LINQ) )

string str = "TestTrak";
string newString = string.Join("",
                         str.Select(r=> char.IsUpper(r) ?" " + r: r.ToString()));
newString = newString.Trim(); //to remove space from the start

答案 3 :(得分:0)

试试这个:

if (string.IsNullOrWhiteSpace(stringToSplit)) return stringToSplit;
var stringBuilder = new StringBuilder();
for (int i = 0; i < stringToSplit.Length; i++)
{
    if (Char.IsUpper(stringToSplit[i]))
    { 
        stringBuilder.Append(" ");
    }
    stringBuilder.Append(stringToSplit[i]);
}
return stringBuilder.ToString().Trim();