我有一个包含实现破折号分隔命名约定的标签名称的大型 XML 文件。如何使用 C# 将标签名称转换为驼峰命名约定?

规则是:
1.将所有字符转换为小写
2. 每个破折号后的第一个字符大写
3. 删除所有破折号

示例
转换前

<foo-bar>
 <a-b-c></a-b-c>
</foo-bar>

转换后
<fooBar>
 <aBC></aBC>
</fooBar>

这是一个有效的代码示例,但处理速度很慢 - 我认为有更好的方法来实现我的目标。
string ConvertDashToCamelCase(string input)
{
    input = input.ToLower();
    char[] ca = input.ToCharArray();
    StringBuilder sb = new StringBuilder();

    for(int i = 0; i < ca.Length; i++)
    {
        if(ca[i] == '-')
        {
            string t = ca[i + 1].ToString().toUpper();
            sb.Append(t);
            i++;
        }
        else
        {
            sb.Append(ca[i].ToString());
        }
    }

    return sb.ToString();
}

最佳答案

你的原始代码很慢的原因是你不必要地到处调用 ToString 。没有那个必要。也不需要 char 的中间数组。以下应该更快,并且比使用 String.Split 的版本更快。

string ConvertDashToCamelCase(string input)
{
    StringBuilder sb = new StringBuilder();
    bool caseFlag = false;
    for (int i = 0; i < input.Length; ++i)
    {
        char c = input[i];
        if (c == '-')
        {
            caseFlag = true;
        }
        else if (caseFlag)
        {
            sb.Append(char.ToUpper(c));
            caseFlag = false;
        }
        else
        {
            sb.Append(char.ToLower(c));
        }
    }
    return sb.ToString();
}

我不会声称以上是最快的。事实上,有几个明显的优化可以节省一些时间。但上面的内容很清晰:易于理解。

关键是 caseFlag ,用于指示复制的下一个字符应设置为大写。另请注意,我不会自动将整个字符串转换为小写。没有理由这样做,因为无论如何您都会查看每个字符并且可以在那时进行适当的转换。

这里的想法是代码不会做任何比它绝对必须做的更多的工作。

关于c# - 通过 C# 将破折号分隔的字符串转换为驼峰式大小写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29927918/

10-17 00:49