VB.NET 複数選択のリストボックスListBoxで選択された項目を配列で取得する
VB.NETの複数選択のリストボックスで、選択された項目を配列で取得する方法を紹介します。
ForEachなどのループ処理で1つづつ選択されているかどうか判定して、配列に追加していく方法もありますが、無名関数(ラムダ式)を使用すればシンプルに1行で取得できます。
| Value | Text | Seleted |
|---|---|---|
| 1 | りんご | True |
| 2 | ばなな | False |
| 3 | みかん | True |
| 4 | いちご | True |
Dim arr As ListItem()
arr = ListItem1.Items.Cast(Of ListItem).Where(Function(i) i.Selected = True).ToArrayWhereの中で指定しているのが無名関数です。
無名関数が1項目ごとに実行され、無名関数の引数のiには現在の項目が渡されます。
無名関数の返却値がTrueの場合の項目のみ抽出されるため、選択中の項目(Selected = True)のみTrueで返却するようにしています。
1行で記載しているため、わかりにくいかもしれませんが、無名関数を複数行で記載すると以下のようになります。
Dim arr As ListItem()
arr = ListItem1.Items.Cast(Of ListItem).Where(Function(i)
Return i.Selected = True
End Function).ToArray項目の値を配列で取得
項目ではなく、項目の値を配列で取得したい場合は、以下のようにします。
Dim str As String()
str = ListItem1.Items.Cast(Of ListItem).Where(Function(i) i.Selected = True).Select(Function(i) i.Value).ToArray
Console.WriteLine(str)
'出力結果
'{"1", "3", "4"}Where句の無名関数で絞り込んだあと、Select句の無名関数を実行します。
無名関数の返却値が抽出されるため、項目の値(Value)を返却するようにしています。
テキスト値を取得したい場合は以下のようにTextを返却するようにします。
Dim str As String()
ListItem1.Items.Cast(Of ListItem).Where(Function(i) i.Selected = True).Select(Function(i) i.Text).ToArray
Console.WriteLine(str)
'出力結果
'{"りんご", "みかん", "いちご"}Value:Textの形式のように、無名関数の中で自由に返却値を加工できます。
Dim str As String()
ListItem1.Items.Cast(Of ListItem).Where(Function(i) i.Selected = True).Select(Function(i) i.Value & ":" & i.Text).ToArray
Console.WriteLine(str)
'出力結果
'{"1:りんご", "3:みかん", "4:いちご"}
'複数行で記載
ListItem1.Items.Cast(Of ListItem).Where(Function(i) i.Selected = True).Select(Function(i)
Return i.Value & ":" & i.Text
End Function).ToArrayカンマ区切りの文字列で取得
VB.NET 配列をカンマ区切りの文字列に変換するで紹介した方法と組み合わせれば、選択中の値をカンマ区切りやスラッシュ区切りの文字列に簡単に変換することができます。
'配列で取得
Dim str As String
str = String.Join(",", ListItem1.Items.Cast(Of ListItem).Where(Function(i) i.Selected = True).Select(Function(i) i.Value).ToArray)
Console.WriteLine(str)
'出力結果
'1,3,4