2016-10-10 9 views
-2

文字列からアンダースコアを削除し、次の文字を大文字に置き換える簡単な方法を探しています。例えばString small replacement

From: "data" to: "Data" 
From: "data_first" to: "DataFirst" 
From: "data_first_second" to: "DataFirstSecond" 
+0

これは正規表現のためのかなり良いフィット感のようです... –

+0

正規表現の解決策は私のために最適です。 – CroMagnon

答えて

3

コードの複数行を必要とします:

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(); 
} 
3

このアプローチは、文字列を反復することを「有限状態機械」として知られている - でそれは状態の有限集合を有することが(「単語の最初の文字であります単語の中の下線「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(); 
+1

'input'の長さの' StringBuilder'コンストラクタに 'capacity'を渡すと、パフォーマンスが向上します – haim770

+1

+1 [JsFiddle Proof](https://dotnetfiddle.net/rqXYmN)。 (私はポスターに代わって努力していると思われる質の低い質問のファンではないが) –

+0

@ haim770ありがとう - 私はその最適化を追加しました。 – Dai

0

私はこのような何かをしますか?

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); 
0

有効な他のすべての答えを...文化を意識した方法のために:

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()); 
+0

ToTitleCaseは.NETでカルチャーを意識していません。最初の文字は大文字に変換されます( "en-US"と "と"の "。 – Dai

+0

これは、スペースの後の文字を、大文字と小文字に変換します。 –

+1

@Daiこれはなぜこのコンテキストでは悪いことでしょうか? –

0

LINQとSplitのような方法を使用してください:

var result = string.Join("",str.Split('_') 
      .Select(c => c.First().ToString() 
      .ToUpper() + String.Join("", c.Skip(1))));