C# 串小替换

C# 串小替换,c#,string,C#,String,我正在寻找一种从字符串中删除下划线并用大写字母替换下一个字符的简单方法 例如: 从:“数据”到:“数据” 从:“数据优先”到:“数据优先” 从:“数据第一秒”到:“数据第一秒” 这种方法被称为“有限状态机”,它通过字符串进行迭代,因为它有一组有限的状态(“是单词中下划线“vs”字符后的第一个字母”)。这表示执行任务所需的最少指令。可以使用正则表达式实现相同的效果,但它在运行时至少会生成相同数量的指令。手动编写代码可以保证最小的运行时间 这种方法的优点是绝对的性能:不需要执行不必要的中间字符串分配

我正在寻找一种从字符串中删除下划线并用大写字母替换下一个字符的简单方法

例如:

从:“数据”到:“数据”
从:“数据优先”到:“数据优先”
从:“数据第一秒”到:“数据第一秒”

这种方法被称为“有限状态机”,它通过字符串进行迭代,因为它有一组有限的状态(“是单词中下划线“vs”字符后的第一个字母”)。这表示执行任务所需的最少指令。可以使用正则表达式实现相同的效果,但它在运行时至少会生成相同数量的指令。手动编写代码可以保证最小的运行时间

这种方法的优点是绝对的性能:不需要执行不必要的中间字符串分配,它只在输入字符串中迭代一次,时间复杂度为O(n),空间复杂度为O(n)。这是无法改进的

public static String ConvertUnderscoreSeparatedStringToPascalCase(String input) {

    Boolean isFirstLetter = true;
    StringBuilder output = new StringBuilder( input.Length );
    foreach(Char c in input) {

        if( c == '_' ) {
            isFirstLetter = true;
            continue;
        }

        if( isFirstLetter ) {

            output.Append( Char.ToUpper( c ) );
            isFirstLetter = false;
        }
        else {
            output.Append( c );
        }
    }

    return output.ToString();
}

我会这样做:

string test = "data_first_second";

string[] testArray=test.Split('_');

StringBuilder modifiedString = new StringBuilder();
foreach (string t in testArray)
{
     modifiedString.Append(t.First().ToString().ToUpper() + t.Substring(1));
}
test=modifiedString.toString();
var result = string.Join("",str.Split('_')
             .Select(c => c.First().ToString()
             .ToUpper() + String.Join("", c.Skip(1))));

谁需要不止一行代码

var output = Regex.Replace(input, "(?:^|_)($|.)", m => m.Groups[1].Value.ToUpper());

您可以使用
String.Split
和以下LINQ查询:

IEnumerable<string> newStrings = "data_first_second".Split('_')
   .Select(t => new String(t.Select((c, index) => index == 0 ? Char.ToUpper(c) : c).ToArray()));
string result = String.Join("", newStrings);
IEnumerable newStrings=“data\u first\u second”。拆分(“”)
.Select(t=>newstring(t.Select((c,index)=>index==0?Char.ToUpper(c):c.ToArray());
字符串结果=string.Join(“,newstring);

所有其他答案都有效。。。以文化意识的方式:

var textInfo = CultureInfo.CurrentCulture.TextInfo;
var modifiedString = textInfo.ToTitleCase(originalString).Replace("_","")
我做了一把小提琴:

使用LINQ和如下方法:

string test = "data_first_second";

string[] testArray=test.Split('_');

StringBuilder modifiedString = new StringBuilder();
foreach (string t in testArray)
{
     modifiedString.Append(t.First().ToString().ToUpper() + t.Substring(1));
}
test=modifiedString.toString();
var result = string.Join("",str.Split('_')
             .Select(c => c.First().ToString()
             .ToUpper() + String.Join("", c.Skip(1))));

这似乎非常适合正则表达式…正则表达式解决方案最适合我。将
capacity
传递给
StringBuilder
构造函数,长度为
input
可以提高性能+1。(虽然我不喜欢那些不代表海报的低质量问题)@haim770谢谢-我已经添加了优化。@我知道,我只是厌倦了
ToTitleCase
在.NET中没有文化意识,它总是盲目地将第一个字符转换为大写,包括(在
en-US
)像“the”这样的单词,“和”和“of”。这也会将空格后面的字符转换为大写,而不在下划线后面的大写字母转换为小写case@Dai在这种情况下,为什么这是一件坏事?@Dai it本质上具有文化意识(可能没有实施):-)@ManfredRadlwimmer我会说这是op的意图,但我可能错了……他的例子肯定有用,但是的,这并不都是具体的:-)