C# 在.NET Core中将字符串转换为标题大小写的内置方法?

C# 在.NET Core中将字符串转换为标题大小写的内置方法?,c#,.net-core,C#,.net Core,NET框架有一个方法 在.NETCore中有类似的东西吗 编辑:我正在寻找.NET Core中的内置方法。您可以实现自己的扩展方法: public static class StringHelper { public static string ToTitleCase(this string str) { var tokens = str.Split(new[] { " ", "-" }, StringSplitOptions.RemoveEmptyEntries

NET框架有一个方法

在.NETCore中有类似的东西吗


编辑:我正在寻找.NET Core中的内置方法。

您可以实现自己的扩展方法:

public static class StringHelper
{
    public static string ToTitleCase(this string str)
    {
        var tokens = str.Split(new[] { " ", "-" }, StringSplitOptions.RemoveEmptyEntries);
        for (var i = 0; i < tokens.Length; i++)
        {
            var token = tokens[i];
            tokens[i] = token == token.ToUpper()
                ? token 
                : token.Substring(0, 1).ToUpper() + token.Substring(1).ToLower();
        }

        return string.Join(" ", tokens);
    }
}
 public static class StringExtension
{
    /// <summary>
    /// Should capitalize the first letter of each word. Acronyms will stay uppercased.
    /// Anything after a non letter or number will keep be capitalized. 
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string ToTitleCase(this string str)
    {
        var tokens = str.Split(new[] { " " }, StringSplitOptions.None);
        var stringBuilder = new StringBuilder();
        for (var ti = 0; ti < tokens.Length; ti++)
        {
            var token = tokens[ti];
            if (token == token.ToUpper())
                stringBuilder.Append(token + " ");
            else
            {
                var previousWasSeperator = false;
                var previousWasNumber = false;
                var ignoreNumber = false;
                for (var i = 0; i < token.Length; i++)
                {

                    if (char.IsNumber(token[i]))
                    {
                        stringBuilder.Append(token[i]);
                        previousWasNumber = true;
                    }
                    else if (!char.IsLetter(token[i]))
                    {
                        stringBuilder.Append(token[i]);
                        previousWasSeperator = true;
                    }
                    else if ((previousWasNumber && !ignoreNumber) || previousWasSeperator)
                    {
                        stringBuilder.Append(char.ToUpper(token[i]));
                        previousWasSeperator = false;
                        previousWasNumber = false;
                    }
                    else if (i == 0)
                    {
                        ignoreNumber = true;
                        stringBuilder.Append(char.ToUpper(token[i]));
                    }
                    else
                    {
                        ignoreNumber = true;
                        stringBuilder.Append(char.ToLower(token[i]));
                    }
                }
                stringBuilder.Append(" ");
            }
        }
        return stringBuilder.ToString().TrimEnd();
    }
}
公共静态类StringHelper
{
公共静态字符串ToTitleCase(此字符串str)
{
var tokens=str.Split(新[]{“,”-“},StringSplitOptions.RemoveEmptyEntries);
for(var i=0;i
信用证:本表明目张胆地抄袭*


*添加了首字母缩略词的位。

似乎在.NET Core中没有内置这样的方法。

不幸的是,直到2016年10月,.NET Core还没有为我们提供一个
ToTitleCase
方法

 public static class StringExtension
{
    /// <summary>
    /// Should capitalize the first letter of each word. Acronyms will stay uppercased.
    /// Anything after a non letter or number will keep be capitalized. 
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string ToTitleCase(this string str)
    {
        var tokens = str.Split(new[] { " " }, StringSplitOptions.None);
        var stringBuilder = new StringBuilder();
        for (var ti = 0; ti < tokens.Length; ti++)
        {
            var token = tokens[ti];
            if (token == token.ToUpper())
                stringBuilder.Append(token + " ");
            else
            {
                var previousWasSeperator = false;
                var previousWasNumber = false;
                var ignoreNumber = false;
                for (var i = 0; i < token.Length; i++)
                {

                    if (char.IsNumber(token[i]))
                    {
                        stringBuilder.Append(token[i]);
                        previousWasNumber = true;
                    }
                    else if (!char.IsLetter(token[i]))
                    {
                        stringBuilder.Append(token[i]);
                        previousWasSeperator = true;
                    }
                    else if ((previousWasNumber && !ignoreNumber) || previousWasSeperator)
                    {
                        stringBuilder.Append(char.ToUpper(token[i]));
                        previousWasSeperator = false;
                        previousWasNumber = false;
                    }
                    else if (i == 0)
                    {
                        ignoreNumber = true;
                        stringBuilder.Append(char.ToUpper(token[i]));
                    }
                    else
                    {
                        ignoreNumber = true;
                        stringBuilder.Append(char.ToLower(token[i]));
                    }
                }
                stringBuilder.Append(" ");
            }
        }
        return stringBuilder.ToString().TrimEnd();
    }
}
我自己创造了一个适合我自己需要的。您可以通过向正则表达式添加自己的分隔符来调整它。 将
\u cultureInfo
替换为适用于您的
cultureInfo
实例

public static class TextHelper
{
     private static readonly CultureInfo _cultureInfo = CultureInfo.InvariantCulture;

     public static string ToTitleCase(this string str)
     {
         var tokens = Regex.Split(_cultureInfo.TextInfo.ToLower(str), "([ -])");

         for (var i = 0; i < tokens.Length; i++)
         {
             if (!Regex.IsMatch(tokens[i], "^[ -]$"))
             {
                 tokens[i] = $"{_cultureInfo.TextInfo.ToUpper(tokens[i].Substring(0, 1))}{tokens[i].Substring(1)}";
             }
         }

         return string.Join("", tokens);
     }
 }
公共静态类TextHelper
{
私有静态只读CultureInfo _CultureInfo=CultureInfo.InvariantCulture;
公共静态字符串ToTitleCase(此字符串str)
{
var tokens=Regex.Split(_cultureInfo.TextInfo.ToLower(str),“([-])”;
for(var i=0;i
我为带有测试的扩展创建了一个,以及一个包含本文中其他解决方案的扩展。您必须取消对行的注释,以查看其他解决方案的输出。此解决方案涵盖了所有想到的场景。您可以在git或fiddle上的测试中验证这些。如果希望在非.NET内核中获得与TextInfo.ToTitleCase类似的输出,我建议您使用此解决方案

 public static class StringExtension
{
    /// <summary>
    /// Should capitalize the first letter of each word. Acronyms will stay uppercased.
    /// Anything after a non letter or number will keep be capitalized. 
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string ToTitleCase(this string str)
    {
        var tokens = str.Split(new[] { " " }, StringSplitOptions.None);
        var stringBuilder = new StringBuilder();
        for (var ti = 0; ti < tokens.Length; ti++)
        {
            var token = tokens[ti];
            if (token == token.ToUpper())
                stringBuilder.Append(token + " ");
            else
            {
                var previousWasSeperator = false;
                var previousWasNumber = false;
                var ignoreNumber = false;
                for (var i = 0; i < token.Length; i++)
                {

                    if (char.IsNumber(token[i]))
                    {
                        stringBuilder.Append(token[i]);
                        previousWasNumber = true;
                    }
                    else if (!char.IsLetter(token[i]))
                    {
                        stringBuilder.Append(token[i]);
                        previousWasSeperator = true;
                    }
                    else if ((previousWasNumber && !ignoreNumber) || previousWasSeperator)
                    {
                        stringBuilder.Append(char.ToUpper(token[i]));
                        previousWasSeperator = false;
                        previousWasNumber = false;
                    }
                    else if (i == 0)
                    {
                        ignoreNumber = true;
                        stringBuilder.Append(char.ToUpper(token[i]));
                    }
                    else
                    {
                        ignoreNumber = true;
                        stringBuilder.Append(char.ToLower(token[i]));
                    }
                }
                stringBuilder.Append(" ");
            }
        }
        return stringBuilder.ToString().TrimEnd();
    }
}
公共静态类StringExtension
{
/// 
///应大写每个单词的第一个字母。首字母缩略词将保持大写。
///非字母或数字后面的任何内容都将保持大写。
/// 
/// 
/// 
公共静态字符串ToTitleCase(此字符串str)
{
var tokens=str.Split(new[]{”“},StringSplitOptions.None);
var stringBuilder=新的stringBuilder();
for(var ti=0;ti
添加了.NET标准2.0(),因此您可以在.NET Core 2.0中使用它


但是,对于.NET Core 1.x支持,您的运气不好。

这里是参考源代码中的代码,但是复制到您自己的项目中看起来并不简单。也许你可以试试。@Eser的可能副本不是副本,Q与.NET无关Core@mxmissileRegex在.NET Core中不可用?这不适用于“正确”的标题大小写,但是旧的.NET方法也不适用。OP请求替换
TextInfo.ToTitleCase
,而不是正确的标题大小写,因此此答案是正确的。这个解决方案并不能处理ToitLecase所处理的所有情况。查看我的解决方案。为什么要将
-
的所有实例转换为```?这显然是一个错误。@MahmoudAl Qudsi你读过代码的其余部分了吗?你真的试过运行它吗?试着删除
ToLower()
方法,如果它适合你的特定需要。我不知道你的意思?删除ToLower会导致编译错误。ToLower和ToUpper是我看到的唯一选择。同样,此解决方案不处理首字母缩略词。在以空格结尾的字符串上引发异常。@MahmoudAl Qudsi我想在方法开头的字符串周围使用适当的
.Trim()
可以解决这个问题吗?