将破折号分隔的字符串通过C#转换为camelCase

问题描述 投票:1回答:4

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

规则是:1.将所有字符转换为小写2.每个破折号的首字符after大写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();
}
c# regex string-conversion
4个回答
5
投票

您的原始代码运行缓慢的原因是因为您不必要地在所有位置调用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,用于表示复制的下一个字符应设置为大写。另请注意,我不会自动将整个字符串转换为小写。没有理由,因为您无论如何都会查看每个字符,并且可以在那时进行适当的转换。

这里的想法是代码不会比绝对要做更多的工作。


3
投票
string ConvertDashToCamelCase(string input)
{
    string[] words = input.Split('-');

    words = words.Select(element => wordToCamelCase(element));

    return string.Join("", words);
}

string wordToCamelCase(string input)
{
    return input.First().ToString().ToUpper() + input.Substring(1).ToLower();
}

1
投票

这里是@Jim Mischel的答案的更新版本,它将忽略内容-即,它将仅使用camelCase标签名称。

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

        // Reset tag flag if necessary
        if(c == '>' || c == '<')
        {
            tagFlag = (c == '<');
        }

    }
    return sb.ToString();
}

0
投票
using System;
using System.Text;

public class MyString
{
  public static string ToCamelCase(string str)
  {
    char[] s = str.ToCharArray();
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < s.Length; i++)
    {
      if (s[i] == '-' || s[i] == '_')
        sb.Append(Char.ToUpper(s[++i]));
      else
        sb.Append(s[i]);
    }
    return sb.ToString();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.