【C#】文字列の操作
今日の備忘録
C#プログラミングのイディオム/定石&パターン
Chapter5 文字列の操作
・+演算子での連結は、大量に行うとパフォーマンス低下につながる。
文字列はイミュータブルなオブジェクトで、書き換えができない。
そのため、連結や文字挿入、文字削除といった操作で、その都度インスタンスが
生成される。
例えば文字列 s1 = "ABC" に "XYZ" を連結すると、 "ABC" の後ろに "XYZ" が
連結されるのではなく、新たに6文字のインスタンスが生成される。
・上記問題を解決するためには、StringBuilder クラスを使用する。
var sb = new StringBuilder();
foreach (var word in GetWords()){
sb.Append.(word);
}
var text = sb.ToString();
・文字列の変換は、ToString メソッドで書式変換する方法もあるが、
String.Format メソッドのほうがおすすめ。なぜなら、ToString には
以下制限があるため。
・複数の変数をまとめて書式化できない
・最小桁数を指定することができない
var number = 12345
string.Format("{0, 10:#,0}, number); // 最小桁数10桁、カンマ付与
var distance = 9876.123m;
string.Format("{0, 10:0.0}", distance)/ // 最小桁数10桁 9876.5
・文字列は参照型だが、 ==演算子、 !=演算子がオーバーロードされているため、
文字列同士で比較が可能。
・問題5.4
ひどいコードを書いてしまった。以下のような感じで、各文字列のインデックス
を取得したが、冗長すぎる。
var text = "Novelist=谷崎潤一郎;BestWork=春琴;Born=1886";
var novelistValue = "Novelist=";
var novelistStartIndex = text.IndexOf(novelistValue) + novelistValue.Length;
var novelistEndIndex = text.IndexOf(";", novelistStartIndex);
var novelist = text.Substring(novelistStartIndex, novelistEndIndex - novelistStartIndex);
var bestWorkValue = "BestWork=";
var bestWorkStartIndex = text.IndexOf(bestWorkValue) + bestWorkValue.Length;
var bestWorkEndIndex = text.IndexOf(";", bestWorkStartIndex);
var bestWork = text.Substring(bestWorkStartIndex, bestWorkEndIndex - bestWorkStartIndex);
var bornValue = "Born=";
var bornStartIndex = text.IndexOf(bornValue) + bornValue.Length;
var bornEndIndex = text.Length;
var born = int.Parse(text.Substring(bornStartIndex, bornEndIndex - bornStartIndex));
回答を見て納得。
まず ';' でスプリット、次に '=' でスプリットすれば、Key と Value を
含む配列ができる。それを表示すればよいだけ。
Key は Novelist 等の英語なので、
日本語化する関数を用意。