restofwaterimpのぎじゅつMemo

SIerに所属。企画から運用まで幅広くやってます。C#中心に書いてます。

【C#】C#プログラミングのイディオム(5章) 文字列の操作

restofwaterimp.hatenablog.com

の続き

次は文字列の操作。 知っているか知っていないかでコーディングできるできないが結構別れる。 書籍に記載のように見やすくもかけるし、ゴリゴリもかけるので、できればすっきり見やすく書けるようになりたいです。

記載されているテーマは以下でした。

  • 文字列の比較
  • 文字の判定
  • 文字列の検索と抽出
  • 文字列の変換
  • 文字列の連結と分割
  • その他文字列操作

今回も気になった部分をピックアップします。

文字列の比較

よく入門時に、オブジェクトが同じものかどうかと中身の値が同じかどうかの比較で頭を悩ます部分がありましたが、 この本の説明は「値」の比較ということで説明されています。

比較 書き方 備考欄
単純比較 str1 == str2
大文字小文字区別無し String.Compare(str1, str2 , ignoreCase : true) ignoreCaseの書き方は C# 4.0以降 trueだけでもかける
ひらがなカタカナ区別無し String.Compare(str1, str2 , new CultureInfo('target language'), CompareOptions.IgnoreKanaType) ignoreCaseの書き方は C# 4.0以降 trueだけでもかける
全角半角区別無し String.Compare(str1, str2, new CultureInfo('target language') , CompareOptions.IgnoreWidth)

先にUpperCaseとか使って、無理やり大文字にとかにして、比較していたな〜と。

MSDNのサイトに書く説明の記載がありました。

String.Compare メソッド (System)

文字列の判定

MSDNのStringメソッドを見ても、多い!と覚えきれない。ただ、「こんなことできないかな?」と思った時に確認はしたいですね。

String メソッド (System)

普段よく使うのは

String.IsNullOrEmpty(str)
str.Contains("strにあるか調べたい文字列")
str.Contains('strにあるか調べたい文字')

文字列の検索と抽出

文字列の抽出が使うことが多い str.Substring(startIndex, cut_length) ただ、こういう時に記載する開始位置にマジックナンバーとして、ハードコーディングはして欲しくないですね。 先にconstでもいいから固定値で定義しておいて、その変数名から設定している意味を表せるようにするとよいです。

文字列のメソッドはそのまま出力とかするのならば、str.xxxでよいが、 結果を使いまわすというときは別の変数に値をおく必要があります。 当たり前じゃん、なんだけど、初学者のうちはやってなくて、値が取れないという人を見かけるので。

文字列の連結と分割

単純には var name = "str1" + "str2" と + 演算子です

メソッドを利用するなら String.Join(separator, array)  ・・ separatorに指定した文字で、文字をつける

str.split(separator) ・・・ separatorsに指定した文字で、文字列を分割し、配列型にする

stringなど文字列は不変オブジェクト そのため、仮に str = str + "aaa"; としても、左辺のstrと右辺のstrは別のメモリ番地を使っている。 やりすぎると、それだけでメモリを多めに使ってしまう。

代わりにStringBuilderを利用することで、解消できます。 var sb = new StringBuilder(); sb.Append("hoge") とするとsbで使用しているメモリ番地の値に"hoge"を追加します。

書籍に記載の指針は ### 繰り返し処理をしない場合は + 演算子 ### foreachなどで、文字列連結を繰り返す場合、StringBuilder ### 繰り返す回数が少ない場合は + 演算子 を使う

その他の文字列操作

pythonなどと同じく、文字列で定義されたものは

foreach(var c in str){
  Console.WriteLine(c + ',');
}

とすれば、strに設定した文字を一つずつ出せる。

文字列へ変換

 hoge.ToString();

とすれば、hogのものを文字列に置き換えられる。 また、ToString('format') またはstring.format(フォーマットの型、hoge) で書式変換できる。

c# 6.0以降で利用できるものが増えてもいる。 せっかく便利なメソッドやLINQでの指定ができるので、使わない手はない。

つづく・・・