将带下划线的字符串转换为TitleCase

时间:2018-11-15 21:24:11

标签: c# string

给出以下字符串:   “ EMAIL_LOG”

我想将其转换为:   EmailLog

我有执行此工作的这段代码:

private static string TitleCaseConvert(string title)
{
    CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
    TextInfo textInfo = cultureInfo.TextInfo;
    title = title.Replace("_", " ").ToLower();
    title = textInfo.ToTitleCase(title);
    title = title.Replace(" ", "");
    return title;
}

我只是想知道是否有更好的建议来进行这种转换,或者是一个更优雅的建议?

谢谢。

6 个答案:

答案 0 :(得分:2)

您可以使用Split()分割_个字符,然后使用StringBuilder重构输出字符串。该应该的效果更好,因为您使用StringBuilder而不是每次都构造新的字符串:

private static string ToPascalCase(string input)
{
    if(input == null)
    {
        throw new ArgumentNullException("input");
    }

    TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo;

    var sb = new StringBuilder();
    foreach(var part in input.Split('_'))
    {
        sb.Append(textInfo.ToTitleCase(part.ToLower()));
    }

    return sb.ToString();
}

请注意,我正在使用CultureInfo.CurrentCulture静态属性。我认为它可以更准确地描述您想要的东西...

提琴here

答案 1 :(得分:1)

如何在一个语句中这样做,像这样:

private static string TitleCaseConvert(string title)
{ 
   return new CultureInfo("en").TextInfo.ToTitleCase(title.ToLower().Replace("_", " ")).Replace(" ", "");
}

答案 2 :(得分:0)

如果您追求原始性能,则可以直接在char数组上进行操作:

private static string TitleCaseConvert(string title)
{
    int wordStart = 0;

    char[] result = new char[title.Length];
    int ri = 0;
    for (int i = 0; i < title.Length; ++i)
    {
        if (title[i] == '_')
        {
            wordStart = i + 1;
        }
        else if (i == wordStart)
        {
            result[ri++] = Char.ToUpper(title[i]);
        }
        else
        {
            result[ri++] = Char.ToLower(title[i]);
        }
    }

    return new String(result, 0, ri);
}

否则,StringBuilder实现可能更短,更易读。

答案 3 :(得分:0)

您可以在这件事上抛Regex.Replace()来挑选第一个字符,转储下划线并将其大写。

title = Regex.Replace("this_is_a_test", @"(^|_)([a-z])", m =>  m.ToString().Replace("_","").ToUpper());

答案 4 :(得分:0)

使用Microsoft.VisualStudio的替代方法:

var title = Strings.StrConv("EMAIL_LOG", VbStrConv.ProperCase).Replace("_", "");

使用Humanizer库:

var title = "EMAIL_LOG".ToLower().Pascalize();

答案 5 :(得分:-1)

在任何库中,您都拥有_.camelCase的{​​{1}}函数。

lodash

我们添加(也来自_.camelCase("EMAIL_LOG") // "emailLog" lodash函数以将第一个字符大写。

_.upperFirst

骆驼套

  

骆驼案是写复合词或短语这样的做法   短语中间的每个单词或缩写都以   大写字母,中间没有空格或标点符号。

Lodash

  

Lodash是一个JavaScript库,可为   使用功能编程范例进行常见的编程任务。