none
VB2010: Array DataのTextBox.Textへの表示 RRS feed

  • 質問

  • 以下のプログラムで整数の配列データをTextBox1.Textに表示しようとしていますが、表示結果はSystem.Int32[]がでます。配列データそのものは表示されません。何が悪いかご指摘いただけるとありがたく。

    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) Handles Button1.Click
            Dim K As String = "Random Values: " & Convert.ToString(GenerateArrayWithRandomValues)
            TextBox1.Text = K
        End Sub

        Public Function GenerateArrayWithRandomValues()
            Dim n As Integer = 1 + Rnd() * 20
            Dim A(0 To n - 1) As Integer
            Dim i As Integer
            For i = LBound(A) To UBound(A)
                A(i) = Rnd() * 1000
            Next
            GenerateArrayWithRandomValues = A

        End Function

    End Class

    2010年11月18日 12:19

回答

  • Int32[] に格納されている値を TextBox に表示したいなら、配列の中身を1つずつ文字列に変換した後、1つの文字列に結合して TextBox に格納する、といった処理になると思います。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答としてマーク 山本春海 2010年11月30日 2:06
    2010年11月18日 13:18
  • 以下のプログラムで整数の配列データをTextBox1.Textに表示しようとしていますが、表示結果はSystem.Int32[]がでます。配列データそのものは表示されません。何が悪いかご指摘いただけるとありがたく。

    GenerateArrayWithRandomValuesはInt32の配列ですので、それをToString()すればその配列を表す文字列が返され、System.Int32[]が表示されます。ToString()メソッドによりどのようなものを表示するかはそのクラスの定義によります。もし、ToString()が配列の個々の要素を表示するように実装されていれば、お望みの結果が得られるのでしょうが、残念ながらそのような実装にはなっていません。それに、個々の要素を結合する際の区切り文字も不明です。

    ところで、Functionの戻り値の型はきちんと指定した方が良いでしょう。

    Public Function GenerateArrayWithRandomValues() as Integer()
    

    さて、個々のデータを表示する方法としては、なかむらさんが書かれていることが一番素直な考え方だと思いますが、私はLinqを使った方法をご紹介しておきます。

    Dim K As String = "Random Values: " & String.Join(", ", GenerateArrayWithRandomValues)
    

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2010年11月30日 2:06
    2010年11月18日 15:04
    モデレータ
  • 数値の配列内容を "|" で連結するコード書いてみました。
    私は自分で連結する方が好きです。

    Dim intArray As Integer() = {1, 2, 3}

    '●自分で連結する方法●
    Dim sb As New StringBuilder()
    For Each value In intArray
        If sb.Length > 0 Then sb.Append("|")
        sb.Append(value)
    Next
    Dim text = sb.ToString()

    MessageBox.Show(text)

    '●標準機能を使って連結する方法●
    Dim strArray = _
        Array.ConvertAll(Of Integer, String) _
        (intArray, Function(intValue) intValue.ToString())
    text = String.Join("|", strArray)
    (追記:
    2010(.NET4)では Object 型の配列を受け取るオーバーロードが追加されてたんですね。
    2008 でテストしてしまったので、変換が必要だと思ってしまいました。)

    MessageBox.Show(text)

    あと、SilentMajority さんはメソッドの戻り値のところで
    GenerateArrayWithRandomValues = A
    とされていますけど、return A とされた方がわかりやすいと私は思います。

    それから、trapemiya さんは Linq と書かれましたけど、静的メソッドの利用かなと思いました。
    それと、汎用性が少しなさそうなものを拡張メソッドにするのは、私はあまり良くないと思ってます。
    細かなこと書いてすみません。

    • 編集済み TH01 2010年11月19日 8:58 追記
    • 回答としてマーク 山本春海 2010年11月30日 2:07
    2010年11月19日 2:27
  • それから、trapemiya さんは Linq と書かれましたけど、静的メソッドの利用かなと思いました。
    それと、汎用性が少しなさそうなものを拡張メソッドにするのは、私はあまり良くないと思ってます。
    細かなこと書いてすみません。

    ごめんなさい。Linqじゃないです(^^; ご指摘ありがとうございます。Joinにマウスポインタを持って行ったらLinqの名前空間が表示されたんでそのままスルーして書いてしまいました。ちょっと考えればわかりそうなものなんですけど、こういう形はLinqと勝手に脳内変換していたようです。(でもなぜVBでは表示しちゃうんだろう?)

    拡張メソッドに関しては全くその通りだと思います。以前に話題になったことがあり、私の考えを書いたことがあります。SilentMajorityさんが何をされたいのかわからなかったので一つの技術の紹介として書いたつもりでしたが、あれだけの文章だと確かに誤解を与えてしまいそうです。こちらもご指摘ありがとうございます。m(_ _)m

    C# 拡張メソッド使用の判断基準
    http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/10bbd792-799c-4e81-969d-87252cc6db86/



     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2010年11月30日 2:09
    2010年11月19日 3:13
    モデレータ
  • あと、SilentMajority さんはメソッドの戻り値のところで
    GenerateArrayWithRandomValues = A
    とされていますけど、return A とされた方がわかりやすいと私は思います。

    私も return 派です。現場では Exit Sub や Exit Function を結構みかけますが、VB.NET ユーザーの方は、いまだに VB6 時代の書き方を引きずってる方が多いみたいですね。

    蛇足になると思いますが、数値配列でなく最初から文字配列にする方法もあります。

    Option Explicit On
    Option Strict On
    
    Public Class Form1
    
      Private Sub Button1_Click(ByVal sender As System.Object, _
                   ByVal e As System.EventArgs) Handles Button1.Click
        MessageBox.Show("Random Values: " & GenerateArrayWithRandomValues())
      End Sub
    
      Private Function GenerateArrayWithRandomValues() As String
    
        Dim a(CInt(Rnd() * 20)) As String
        For i As Integer = 0 To a.Count - 1
          a(i) = (Rnd() * 1000).ToString("0")
        Next
        Return String.Join("|", a)
    
      End Function
    
    End Class
    
    こんな書き方もあるよということで、あくまで参考までに。(^^;
    ひらぽん http://d.hatena.ne.jp/hilapon/
    • 回答としてマーク 山本春海 2010年11月30日 2:07
    2010年11月19日 5:29
    モデレータ

すべての返信

  • Int32[] に格納されている値を TextBox に表示したいなら、配列の中身を1つずつ文字列に変換した後、1つの文字列に結合して TextBox に格納する、といった処理になると思います。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答としてマーク 山本春海 2010年11月30日 2:06
    2010年11月18日 13:18
  • 以下のプログラムで整数の配列データをTextBox1.Textに表示しようとしていますが、表示結果はSystem.Int32[]がでます。配列データそのものは表示されません。何が悪いかご指摘いただけるとありがたく。

    GenerateArrayWithRandomValuesはInt32の配列ですので、それをToString()すればその配列を表す文字列が返され、System.Int32[]が表示されます。ToString()メソッドによりどのようなものを表示するかはそのクラスの定義によります。もし、ToString()が配列の個々の要素を表示するように実装されていれば、お望みの結果が得られるのでしょうが、残念ながらそのような実装にはなっていません。それに、個々の要素を結合する際の区切り文字も不明です。

    ところで、Functionの戻り値の型はきちんと指定した方が良いでしょう。

    Public Function GenerateArrayWithRandomValues() as Integer()
    

    さて、個々のデータを表示する方法としては、なかむらさんが書かれていることが一番素直な考え方だと思いますが、私はLinqを使った方法をご紹介しておきます。

    Dim K As String = "Random Values: " & String.Join(", ", GenerateArrayWithRandomValues)
    

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2010年11月30日 2:06
    2010年11月18日 15:04
    モデレータ
  • なかむらさま、

     

    返信の内容、ありがとうございました。配列で表わされるデータセットが、ToString()により文字列に自動変換されるだろうと「期待した」のは、望み過ぎだったようです。

     

    今回の私の解法は、配列を作るFunctionの中で、配列を作るのと同時並行で、一要素づつ、TextBoxに書き込むことで解決しております。

     

    ありがとうございました。

    SilentMajorityより。

     

    • 編集済み SilentMajority 2010年11月19日 0:53 文字=>要素
    2010年11月19日 0:27
  • Trapemivaさま、

     

    以下の回答ありがとうございます。

     

    ToString()が大変使い易い機能なので、その実力を過信していたようです。ご指摘のとおりと思います。

     

    ご指摘の後半部分については、Join()を使って配列の要素間に区切り文字”|”を入れてから、ToString()に嵌めこむのを試みていますが、まだ、未完成です。

    Linqによる方法が、私の求めていた解法かもしれません。試してみます。

     

    ありがとう。

    SilentMajorityより。

    2010年11月19日 0:32
  •  

    ご指摘の後半部分については、Join()を使って配列の要素間に区切り文字”|”を入れてから、ToString()に嵌めこむのを試みていますが、まだ、未完成です。

    メソッドのような形で書きたいのであれば、拡張メソッドとして実装してしまうという方法もありますね。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年11月19日 0:53
    モデレータ
  • 数値の配列内容を "|" で連結するコード書いてみました。
    私は自分で連結する方が好きです。

    Dim intArray As Integer() = {1, 2, 3}

    '●自分で連結する方法●
    Dim sb As New StringBuilder()
    For Each value In intArray
        If sb.Length > 0 Then sb.Append("|")
        sb.Append(value)
    Next
    Dim text = sb.ToString()

    MessageBox.Show(text)

    '●標準機能を使って連結する方法●
    Dim strArray = _
        Array.ConvertAll(Of Integer, String) _
        (intArray, Function(intValue) intValue.ToString())
    text = String.Join("|", strArray)
    (追記:
    2010(.NET4)では Object 型の配列を受け取るオーバーロードが追加されてたんですね。
    2008 でテストしてしまったので、変換が必要だと思ってしまいました。)

    MessageBox.Show(text)

    あと、SilentMajority さんはメソッドの戻り値のところで
    GenerateArrayWithRandomValues = A
    とされていますけど、return A とされた方がわかりやすいと私は思います。

    それから、trapemiya さんは Linq と書かれましたけど、静的メソッドの利用かなと思いました。
    それと、汎用性が少しなさそうなものを拡張メソッドにするのは、私はあまり良くないと思ってます。
    細かなこと書いてすみません。

    • 編集済み TH01 2010年11月19日 8:58 追記
    • 回答としてマーク 山本春海 2010年11月30日 2:07
    2010年11月19日 2:27
  • それから、trapemiya さんは Linq と書かれましたけど、静的メソッドの利用かなと思いました。
    それと、汎用性が少しなさそうなものを拡張メソッドにするのは、私はあまり良くないと思ってます。
    細かなこと書いてすみません。

    ごめんなさい。Linqじゃないです(^^; ご指摘ありがとうございます。Joinにマウスポインタを持って行ったらLinqの名前空間が表示されたんでそのままスルーして書いてしまいました。ちょっと考えればわかりそうなものなんですけど、こういう形はLinqと勝手に脳内変換していたようです。(でもなぜVBでは表示しちゃうんだろう?)

    拡張メソッドに関しては全くその通りだと思います。以前に話題になったことがあり、私の考えを書いたことがあります。SilentMajorityさんが何をされたいのかわからなかったので一つの技術の紹介として書いたつもりでしたが、あれだけの文章だと確かに誤解を与えてしまいそうです。こちらもご指摘ありがとうございます。m(_ _)m

    C# 拡張メソッド使用の判断基準
    http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/10bbd792-799c-4e81-969d-87252cc6db86/



     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2010年11月30日 2:09
    2010年11月19日 3:13
    モデレータ
  • あと、SilentMajority さんはメソッドの戻り値のところで
    GenerateArrayWithRandomValues = A
    とされていますけど、return A とされた方がわかりやすいと私は思います。

    私も return 派です。現場では Exit Sub や Exit Function を結構みかけますが、VB.NET ユーザーの方は、いまだに VB6 時代の書き方を引きずってる方が多いみたいですね。

    蛇足になると思いますが、数値配列でなく最初から文字配列にする方法もあります。

    Option Explicit On
    Option Strict On
    
    Public Class Form1
    
      Private Sub Button1_Click(ByVal sender As System.Object, _
                   ByVal e As System.EventArgs) Handles Button1.Click
        MessageBox.Show("Random Values: " & GenerateArrayWithRandomValues())
      End Sub
    
      Private Function GenerateArrayWithRandomValues() As String
    
        Dim a(CInt(Rnd() * 20)) As String
        For i As Integer = 0 To a.Count - 1
          a(i) = (Rnd() * 1000).ToString("0")
        Next
        Return String.Join("|", a)
    
      End Function
    
    End Class
    
    こんな書き方もあるよということで、あくまで参考までに。(^^;
    ひらぽん http://d.hatena.ne.jp/hilapon/
    • 回答としてマーク 山本春海 2010年11月30日 2:07
    2010年11月19日 5:29
    モデレータ
  • ひらぽんさま、

    最初から文字配列で書いてしまうのは、発想の転換で驚きました。無論、「参考」までであることも、十分了解です。

     

    みなさま、

    細かいコーディング作法も含めて有益なコメントを頂きまして、ありがとうございます。大変参考になりました。

    新参者ですが、今後もよろしくお願いします。

     

    SilentMajorityより。

    2010年11月19日 6:46
  • みなさま、

    最終的に以下のようなコーディングとなりました。おかげさまにて、大変心地よく動いています。

    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) Handles Button1.Click
            Dim K As String = "Random Values: " & String.Join(", ", GenerateArrayWithRandomValues)
            TextBox1.Text = K
        End Sub

        Public Function GenerateArrayWithRandomValues() As Integer()
            Dim n As Integer = 1 + Rnd() * 20
            Dim intArray(0 To n - 1) As Integer
            Dim i As Integer
            For i = LBound(intArray) To UBound(intArray)
                intArray(i) = Rnd() * 1000
            Next
            Return intArray
        End Function

    End Class

    TextBox上の表示結果もここに載せたいところですが、このフォーラム機能に慣れていませんので、今回は割愛させてもらいます。

    なお、このコードブロックの目的が不明とのご指摘がありましたので、若干触れますと、これは、各種ソートアルゴリズム紹介のサンプルプログラムの共通部として使う、テストデータ発生部分です。

    よろしく。

    SilentMajorityより。

    2010年11月19日 8:01