転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

【技術書メモ】C#プログラミングのイディオム / 定石&パターン⑤

今回は文字列操作編!
そういえば、会社の研修でJavaを勉強し始めた当初、文字列の比較のやり方がわからなくて、かなりつまづいたな。
結局、10才近く年下の子にやり方教えてもらったのは、いい思い出です。

文字列の比較

C#での文字列比較をやっていきます。
まず、これが一番シンプルな比較方法。大文字小文字も区別される。

if (str1 == str2)


次が、大文字小文字の区別なく比較する方法。
3つ目の引数のtrueが、大文字小文字の区別なく比較することを表している。

if (String.Compare(str1, str2, ignoreCasetrue) == 0)


ひらがなとカタカナを区別なく、比較することも可能。

var str1 = "カステラ";
var str2 = "かすてら";
var cultureInfo = new CultureInfo("ja-JP");
if(String.Compare(str1, str2, cultureInfo, CompareOptions.IgnoreKanaType) == 0)


全角半角の区別なく比較するには

var str1 = "HTML5";
var str2 = "HTML5";
var cultureInfo = new CultureInfo("ja-JP");
if(String.Compare(str1, str2, cultureInfo, CompareOptions.IgnoreWidth) == 0)


また、String.Compareメソッドの第3引数は論理演算子で繋げることも可能で

var str1 = "Html5";
var str2 = "HTML5";
var cultureInfo = new CultureInfo("ja-JP");
// 大文字小文字と全角半角の区別なく比較
if (string.Compare(str1, str2, cultureInfo, CompareOptions.IgnoreWidth | CompareOptions.IgnoreCase) == 0)

文字列の判定

nullあるいは空文字かを判定。これはよく使いそう。

if(String.IsNullOrEmpty(str))


空文字かを判定する。

if(str == String.Empty)


nullか空文字か空白文字列かを判定する。空白文字列も判定できるのか。

if(String.IsNullOrWhiteSpace(str))


指定した文字列で始まっているか。

if(str.StartsWith("Visual"))


指定した文字列で終わっているか。

if(str.EndsWith("Exception"))


指定した部分文字列が含まれているか。

if(str.Contains("Program"))


上記は文字列だったが、文字が含まれているかを調べるには、LINQを使う。

var target = "The quick brown fox jumps over the lazy dog.";
var contains = target.Contains('b');


次もまたLINQ。条件を満たしている文字が含まれているか。

var target = "C# Programming";
// 小文字が含まれているかチェック
var isExists = target.Any(c => Char.IsLower(c));


上記はどれか1文字でも条件を満たしているかどうかのチェックだったが、今度はすべての文字が条件を見てしているかをチェックする。

var target = "141421536";
// 数字かどうかをチェック
var isAllDigits = target.All(c => Char.IsDigit(c));

文字列の検索と抽出

部分文字列を検索し、その位置を求める。

var target = "NameList;BirthdayList";
var index = target.IndexOf("BirthdayList");


文字列の一部を取り出す。

// 指定した位置から最後までを部分文字列として取り出す
var value = target.Substring(index);


取り出す長さを指定することもできる.

var value = target.Substring(index, endIndex - startIndex);

文字列の変換

文字列の前後の空白を取り除く。

var replaced = target.Trim();


文字列の前後片方だけの空白を取り除く。

var replaced1 = target.TrimStart();
var replaced2 = target.TrimEnd();


指定した位置から任意の数の文字を削除する。

var result = target.Remove(5, 3);


指定した位置に文字列を挿入する。

var target = "01234";
// 01abc234が出力される
var result = target.Insert(2, "abc");


文字列の一部を別の文字列で置き換える。

var target = "I hope you could come to with us.";
// I wish you could come to with us.と出力される。
var replaced = target.Replace("hope", "wish");


小文字を大文字に変換する。

var replaced = target.ToUpper();


大文字を小文字に変換する。

var replaced = target.ToLower();

文字列の連結と分割

文字列の連結は、+演算子を使う。これは、Javaと一緒。

var name = "山田" + "太郎";


文字列の末尾に追加する。

var name = "やまだ";
name += "先生";


指定した区切り文字で文字列配列を連結する。

var languages = new[]{"C#", "Java", "VB", "Ruby", };
var separator = ",";
// C#, Java, VB, Rubyと出力される
var result = String.Join(separator, languages);


指定した文字で文字列を分割する。
>|cs|
var target = "I hope you could come to with us.";
// 空白文字で分割する
string[] words = target.Split(' ');


なお、空の配列要素を含めないようにするには、以下の書き方が必要。

var target = "I hope you could come to with us.";
// 空白文字で分割する
string[] words = target.Split(new [] {' ', '.'}, StringSplitOptions.RemoveEmptyEntries);


文字列は基本的に普変オブジェクトである。そのため、文字連結を行うたびに、新たなインスタンスを生成していることになる。
そこで、StringBuilderを使った文字連結がある。StringBuilderクラスは、インスタンス生成時に、文字列を格納する領域を確保し、その領域を超えて文字列を追加しようとした場合は、自動的に容量が増えていく。そのため、無駄なインスタンスを生成する必要がない。

var sb = new StringBuilder();
foreach (var word in GetWords()) {
    sb.Append(word);
}
// 文字列に変換
var text = sb.ToString();

その他の文字列操作

文字列から文字を1つずつ取り出すには、foreach文を使う。

foreach (var c in str) { }


文字配列から文字列を生成する。

var chars = new char[] {'P', 'r', 'o', 'g', 'r', 'a', 'm' };
var str = new string(chars);


数値を文字列に変換するには、ToStringメソッドを使用する。
ToStringメソッドには、さまざまな書式指定を引数で行えるが、多すぎるのでここでは割愛する。


指定した書式で文字列を整形するには、String.Formatメソッドを使用する。

var novelist = "やまだ";
var bestWork = "春麗";
var bookline = String.Format("Novelist={0};BestWork={1}", novelist, bestWork);