文字列からアンダースコアを削除し、次の文字を大文字に置き換える簡単な方法を探しています。例えばString small replacement
:
From: "data" to: "Data"
From: "data_first" to: "DataFirst"
From: "data_first_second" to: "DataFirstSecond"
文字列からアンダースコアを削除し、次の文字を大文字に置き換える簡単な方法を探しています。例えばString small replacement
:
From: "data" to: "Data"
From: "data_first" to: "DataFirst"
From: "data_first_second" to: "DataFirstSecond"
コードの複数行を必要とします:
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();
}
このアプローチは、文字列を反復することを「有限状態機械」として知られている - でそれは状態の有限集合を有することが(「単語の最初の文字であります単語の中の下線「vs」文字に続く)。これは、タスクを実行するために必要な最小限の命令を表します。同じエフェクトに対して正規表現を使用することはできますが、実行時に少なくとも同じ数の命令を生成します。手動でコードを書き出すと、実行時間が最小限に抑えられます。
このアプローチの利点は、実行される中間文字列の不必要な割り当てがなく、入力文字列を1回だけ反復することで、O(n)の時間複雑さとO n)。これを改善することはできません。
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();
私はこのような何かをしますか?
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);
有効な他のすべての答えを...文化を意識した方法のために:
var textInfo = CultureInfo.CurrentCulture.TextInfo;
var modifiedString = textInfo.ToTitleCase(originalString).Replace("_","")
私はバイオリンを作ったあなたはString.Split
と、次のLINQクエリを使用することができます
var output = Regex.Replace(input, "(?:^|_)($|.)", m => m.Groups[1].Value.ToUpper());
ToTitleCaseは.NETでカルチャーを意識していません。最初の文字は大文字に変換されます( "en-US"と "と"の "。 – Dai
これは、スペースの後の文字を、大文字と小文字に変換します。 –
@Daiこれはなぜこのコンテキストでは悪いことでしょうか? –
LINQとSplit
のような方法を使用してください:
var result = string.Join("",str.Split('_')
.Select(c => c.First().ToString()
.ToUpper() + String.Join("", c.Skip(1))));
これは正規表現のためのかなり良いフィット感のようです... –
正規表現の解決策は私のために最適です。 – CroMagnon