スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

文字列の連結とか。

.NET1.1時代であれば、文字列の連結は、StringBuilderクラスの出番だった。
Javaの世界では、StringBufferだったかな。
普通のstringクラスがなぜ連結に向かないかは、Javaだろうと、.NETだろうと有名な話。
stringクラスはいわゆるイミュータブル(immutable)なクラス。
イミュータブル
一度インスタンスを作ると、値を変えることはできない。変えているように見えるが実は違うインスタンスなんだと。

var str = "...";
str = str.ToUpper();

1行目と2行目のstrはもう違うインスタンスだそうで。なので、連結を繰り返すと、ひたすら新しいインスタンスを作り、効率が非常に悪い。
その時に出番となったのがStringBuilderクラス。
だったんだけど、.NET4(2?)くらいから、便利なメソッドが実装されていた。
それが、stringクラスのConcatメソッド(static)。ぶっちゃけ、単なる連結なら、これで十分だ。

var strList = new [] {"1", "2", "3", "4", "5"};
var concat = string.Concat(strList); //結果は、"12345"

便利になったものだ。ところで、単なる連結なので、シンプルなのはいいけど、この文字列間に同じ区切り文字を挟みたい時、少々めんどくさいのだ。
例えば、パイプ(|)を挟みたい時なんか、こうするしかない。

var strList = new [] {"1", "|", "2", "|", "3", "|", "4", "|", "5"};
var concat = string.Concat(strList); //結果は、"1|2|3|4|5"

うん。めんどくさいし、DBから取得した任意要素数の配列やリストでは、これが通用しない。
というわけで、ちょっとだけ機能を付け足したメソッドを作成した。

public static class Utils {

/// <summary>
/// 指定されたシーケンスの要素を、指定の区切り文字で連結します。<br/>
/// </summary>
/// <typeparam name="T">リスト要素の型宣言</typeparam>
/// <param name="list">リスト</param>
/// <param name="separator">区切り文字</param>
/// <returns>連結後の文字列</returns>
public static string Concat<T>(IEnumerable<T> list, string separator = "") {

if (list == null) {
return string.Empty;
}

var sb = new System.Text.StringBuilder();
var idx = 0;

try {
if (string.IsNullOrWhiteSpace(separator)) {
return string.Concat(list);
}

foreach (T elem in list) {

if (idx >= 1) {
sb.Append(separator);
}

if (elem != null) {
sb.Append(elem.ToString());
}

idx ++;
}

return sb.ToString();

} finally {
sb = null;
}
}
}

内部ではStringBuilderクラスを使って、ループを回す。

var strList = new [] {"1", "2", "3", "4", "5"};
var concat = Utils.Concat(strList, "|"); //結果は、1|2|3|4|5

第2引数を渡さずに使えば、本家のConcatを使うようにしているので、使い分ける必要もないかなと。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 2 | トラックバック: 0


この記事へのコメント

No title
String.Joinメソッドがありますよ。
Re: No title
おお、ありがとうございます。バージョンアップによるチェックって必要ですね。

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。