VB.NETのコレクション・配列フィルタリングを完全解説!条件に合うデータの抽出方法
生徒
「先生、たくさんのデータが入ったリストの中から、特定の条件に合うものだけを選び出すことはできますか?」
先生
「はい、もちろんです。それをプログラミングでは『フィルタリング』や『抽出(ちゅうしゅつ)』と呼びます。」
生徒
「例えば、テストの結果から80点以上の人だけを探すような感じですね!」
先生
「その通りです!VB.NETには、データをふるいにかける便利な方法がいくつかあります。基本から一つずつ学んでいきましょう!」
1. フィルタリングとは?データの「ふるい分け」
プログラミングにおけるフィルタリングとは、大量にあるデータの中から、自分が決めたルール(条件)に一致するものだけを取り出す作業のことです。日常生活で例えるなら、たくさんの野菜の中から「赤いものだけ」を選んだり、スマートフォンの連絡先から「名字が田中の人だけ」を検索したりする動きに似ています。
VB.NET(ヴィービー・ドットネット)という言語では、配列やリストといったコレクション(データの集まり)を対象に、このフィルタリングを非常に効率よく行うことができます。これをマスターすれば、膨大なデータから必要な情報だけを瞬時に見つけ出すプログラムが作れるようになります。
2. 一番の基本:For Each文とIf文の組み合わせ
最も基本的で、仕組みが分かりやすい方法は、以前学習した「繰り返し処理(ループ)」と「条件分岐(If文)」を組み合わせる方法です。一つひとつのデータを手に取って確認し、条件に合えば別のカゴに移していくという、一番原始的で確実なやり方です。
この方法は、後述する便利な機能を使わなくても、これまでの知識だけで実現できるのが最大の強みです。初心者の方はまずこの流れをしっかりとイメージできるようになりましょう。
3. ループを使ったフィルタリングの実践コード
それでは、実際に数字が入ったリストから「50以上の数字だけ」を取り出すコードを書いてみましょう。新しい空のリスト(カゴ)を用意するのがコツです。
' 全てのデータが入ったリスト
Dim allNumbers As New List(Of Integer) From {10, 85, 42, 67, 23, 90}
' 条件に合うものだけを入れる新しいリスト
Dim filteredList As New List(Of Integer)
' 一つずつ順番にチェックしていきます
For Each num As Integer In allNumbers
' もし数字が50以上なら、新しいリストに追加します
If num >= 50 Then
filteredList.Add(num)
End If
Next
' 結果を表示します
For Each result As Integer In filteredList
Console.WriteLine(result & " は50以上です。")
Next
実行結果は以下の通りです。
85 は50以上です。
67 は50以上です。
90 は50以上です。
4. LINQ(リンク)を使ったスマートな抽出
先ほどのループを使った方法は分かりやすいですが、コードが少し長くなってしまいます。そこで登場するのがLINQ(リンク)という機能です。LINQを使うと、「〇〇という条件でデータを探して!」という命令を、まるで英語の文章のように短く書くことができます。
現代のVB.NET開発では、このLINQを使ったフィルタリングが主流です。なぜなら、読みやすく、間違いが少なくなるからです。特にWhere(ウェア)というキーワードを使うことで、特定の条件を絞り込むことができます。
5. LINQで文字列のリストを絞り込む方法
次は文字列(文字のデータ)をフィルタリングしてみましょう。例えば、名前のリストの中から「『た』で始まる名前」だけを探すプログラムです。
Dim names As New List(Of String) From {"たなか", "さとう", "たか橋", "すずき"}
' LINQ(クエリ構文)を使って「た」から始まる名前を抽出
Dim results = From n In names
Where n.StartsWith("た")
Select n
' 抽出された名前を順番に表示
For Each name In results
Console.WriteLine("見つかりました: " & name)
Next
実行結果は以下の通りです。
見つかりました: たなか
見つかりました: たか橋
Where n.StartsWith("た") という部分が、「『た』で始まるもの」というフィルターの役割を果たしています。非常に直感的で分かりやすいですね。
6. 複数の条件を組み合わせる(AndとOr)
フィルターは一つだけでなく、複数の条件を重ねることもできます。例えば、「50点以上」かつ「80点未満」といった範囲指定や、「東京都の人」または「神奈川県の人」といった指定が可能です。
これには、以前の授業で習ったAnd(アンド)やOr(オア)を使います。これにより、より複雑で精度の高いデータ抽出が可能になります。
7. 複数条件でのフィルタリング実演
今度は、数字のリストから「偶数(2で割り切れる数)」かつ「10より大きい数」を探してみましょう。
Dim data As New List(Of Integer) From {2, 5, 12, 18, 7, 20}
' 偶数(2で割った余りが0)かつ 10より大きい
Dim filteredData = From d In data
Where d Mod 2 = 0 And d > 10
Select d
For Each val In filteredData
Console.WriteLine("条件一致: " & val)
Next
実行結果は以下の通りです。
条件一致: 12
条件一致: 18
条件一致: 20
Mod(モッド)は「割り算の余り」を計算する記号です。このように、計算式をフィルターの中に組み込むことも自由にできます。
8. フィルタリング時に注意すべきこと
便利なフィルタリングですが、初心者がハマりやすいポイントがいくつかあります。一つは「元のリストは変わらない」ということです。フィルタリングを行っても、元のデータが消えてしまうわけではありません。あくまで「条件に合うものを別の場所で覗き見している」状態です。
もう一つは、もし条件に合うものが一つもなかった場合です。その場合、結果は「空っぽ」になりますが、プログラム自体はエラーになりません。空っぽの状態で無理やり何かをしようとするとエラーが起きることがあるので、「見つかったかな?」と件数を確認する習慣をつけると、よりプロらしいコードになります。
9. パフォーマンスと効率の話
データが数件であればどんな方法でも一瞬で終わりますが、これが数百万件という膨大なデータになると、フィルタリングの「効率」が重要になります。
LINQは内部で非常に高度な最適化(速く動くための工夫)が行われているため、基本的にはLINQを使って書くのがおすすめです。また、条件を指定する順番も大切です。例えば、一気にデータが減るような強力な条件を最初に書くことで、パソコンの無駄な計算を減らすことができます。パソコンに優しいプログラムを心がけましょう!
10. フィルタリングを使いこなして次のステップへ
データの抽出ができるようになると、プログラムは一気に「実用的」になります。家計簿アプリで「先月の出費だけ」を表示したり、ゲームで「体力がゼロになった敵だけ」を画面から消したりと、あらゆるところでこの技術が使われています。
まずは一番シンプルな For Each と If の組み合わせから始め、徐々に LINQ の魔法に慣れていってください。自分で書いた条件通りにデータが絞り込まれたときの快感は、プログラミングを続ける大きなモチベーションになるはずです!