昨日、親戚の七七日法要があり、そして今日は彼岸(会法要の中日)と言うこともあり、まあそれに関する説法があったわけで。
印象に残ったのは「此岸は煩悩や迷いに満ちたこの世であり、彼岸は悟りの世界である」的な話があったわけです。
ええ確かに私は此岸、煩悩や迷いに満ちたこの世にいます(汗
VBで、Integerの配列を カンマ区切り(csv形式)の文字列にしたいと考えたとき、String.Join あるいはStrings.Joinでもって一発でつなげてやれば、さあ解決…とおもったがこれができない。
Dim source As Integer() = {1, 2, 3, 4, 5} Dim csv1 = Strings.Join(source, ",") ' これらの引数で呼び出される、アクセス可能な 'Join' がないため、オーバーロードの解決に失敗しました: ' Public Function Join(SourceArray() As String, [Delimiter As String = " "]) As String': ' 'Integer' は 'String' から派生していないため、型 'Integer の 1 次元配列'の値を ' 'String の 1 次元配列' に変換できません。 ' Public Function Join(SourceArray() As Object, [Delimiter As String = " "]) As String': ' 'Integer' が参照型でないため、'Integer の 1次元配列' 型の値を ' 'Object の 1 次元配列' に変換できません。 Dim csv2 = String.Join(",", source) ' 'Integer' は 'String' から派生していないため、型 'Integer の 1 次元配列' の値を ' 'String の 1 次元配列' に変換できません。
要は要素が「String型じゃないからだめ」「値型だからだめ」との由…。
まあ仰ることごもっともなんですが、「数値要素をセパレータで連結して文字列にする」なんてありふれているんだからあっさりやらせてよ、というのが私の主張…
で、こんなのはその気になればベタですぐコードがかける訳ですが。
Dim source As Integer() = {1, 2, 3, 4, 5} Dim csv = source(0).ToString For indexNo As Integer = 1 To source.Length - 1 csv &= "," & source(indexNo) Next
ですが、こういうものをベタで書く時代は終わっているのではないかと思っていて、なにか join メソッド系で手がないかと思うわけです。で、2日がかりで導いたコードは以下。
Dim source As Integer() = {1, 2, 3, 4, 5} Dim int2strConverter As New System.Converter(Of Integer, String)(Function(x) x.ToString) Dim s() = Array.ConvertAll(source, int2strConverter) Dim csv As String = Strings.Join(s, ",")
確かに join を使用することには成功してはいますが、記述量も可読性も効率もいまひとつな感じ…
どうがいいのかなあ。まさに此岸にいて、煩悩や迷いに満ちていることを実感できる秋分の日でありました…
オールトの雲
[VB.NET] integer を Strings.Join で結合する方法 (その2)
前回、最終的にこんなコードを書いたわけですが。
Link | 2010年9月30日 01:27