トップ回答者
VB2010: Array DataのTextBox.Textへの表示

質問
-
以下のプログラムで整数の配列データを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 SubPublic 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 = AEnd Function
End Class
回答
-
以下のプログラムで整数の配列データを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
-
数値の配列内容を "|" で連結するコード書いてみました。
私は自分で連結する方が好きです。
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 と書かれましたけど、静的メソッドの利用かなと思いました。
それと、汎用性が少しなさそうなものを拡張メソッドにするのは、私はあまり良くないと思ってます。
細かなこと書いてすみません。 -
それから、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
-
あと、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
すべての返信
-
以下のプログラムで整数の配列データを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
-
なかむらさま、
返信の内容、ありがとうございました。配列で表わされるデータセットが、ToString()により文字列に自動変換されるだろうと「期待した」のは、望み過ぎだったようです。
今回の私の解法は、配列を作るFunctionの中で、配列を作るのと同時並行で、一要素づつ、TextBoxに書き込むことで解決しております。
ありがとうございました。
SilentMajorityより。
- 編集済み SilentMajority 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 と書かれましたけど、静的メソッドの利用かなと思いました。
それと、汎用性が少しなさそうなものを拡張メソッドにするのは、私はあまり良くないと思ってます。
細かなこと書いてすみません。 -
それから、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
-
あと、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
-
みなさま、
最終的に以下のようなコーディングとなりました。おかげさまにて、大変心地よく動いています。
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 SubPublic 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 FunctionEnd Class
TextBox上の表示結果もここに載せたいところですが、このフォーラム機能に慣れていませんので、今回は割愛させてもらいます。
なお、このコードブロックの目的が不明とのご指摘がありましたので、若干触れますと、これは、各種ソートアルゴリズム紹介のサンプルプログラムの共通部として使う、テストデータ発生部分です。
よろしく。
SilentMajorityより。