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