VB.NETのLINQ完全ガイド!初心者でもデータの抽出・並び替えが簡単にできる方法
生徒
「先生、たくさんのデータの中から特定の条件に合うものだけを取り出したいとき、どうすればいいですか?」
先生
「VB.NETには、LINQ(リンク)という魔法のような仕組みがあります。これを使えば、複雑なループを書かなくても一行でデータを操作できるんですよ。」
生徒
「魔法ですか!初心者でも使いこなせますか?」
先生
「はい、とても直感的です。それでは、基本的なLINQの使い方をマスターしていきましょう!」
1. LINQ(リンク)とは何か?
LINQとは「Language Integrated Query」の略称で、日本語では「言語統合クエリ」と呼びます。これだけ聞くと難しそうですが、簡単に言うと「配列やコレクション(データの集まり)に対して、検索したり、並び替えたりするための専用の命令文」のことです。
例えば、100枚のカードの中から「赤いカードだけを取り出す」とか「数字の大きい順に並べる」といった作業を、プログラミングの世界でスマートに行うための道具です。通常、こうした作業を行うには「繰り返し処理(For Eachなど)」を使って一つずつ確認していく必要がありますが、LINQを使うと非常に短いコードで、読みやすく書くことができます。
2. LINQを使うための準備
VB.NETでLINQを使うためには、プログラムの冒頭で「LINQの機能を使いますよ」という宣言が必要になることがあります。現在の多くの開発環境では自動的に設定されていますが、基本的には「Imports System.Linq」という一文が裏側で動いています。
また、LINQはコレクションと呼ばれるデータの集合体に対して使います。配列(Array)やリスト(List)などがその代表です。これから紹介する例では、数字のリストや文字列のリストを元に、どのようにデータを加工していくかを解説します。
3. データを絞り込む「Where」の使い方
もっとも頻繁に使われるのが、条件に合うデータだけを抽出するWhere(ウェア)です。英語の「どこに~があるか」というニュアンスと同じで、「この条件に一致するデータはどこ?」と探すイメージです。
以下のサンプルコードは、数字のリストの中から「50より大きい数字」だけを取り出すプログラムです。
' 数字のリストを作成します
Dim numbers As New List(Of Integer) From {10, 85, 40, 60, 25}
' 50より大きい数字だけを抽出します(LINQのクエリ構文)
Dim result = From n In numbers
Where n > 50
Select n
' 結果を表示します
For Each x In result
Console.WriteLine(x)
Next
実行結果は以下の通りです。
85
60
このように、Where n > 50と書くだけで、複雑な条件判定を省略して必要なデータだけを抜き出すことができました。
4. データを並び替える「Order By」の使い方
次に便利なのが、データを特定のルールで並び替えるOrder By(オーダーバイ)です。名簿をあいうえお順に並べたり、商品の価格が安い順に並べたりする際に大活躍します。
昇順(小さい順)にしたいときはそのまま、降順(大きい順)にしたいときはDescending(ディセンディング)というキーワードを付け加えます。
' 果物の名前リスト
Dim fruits As New List(Of String) From {"りんご", "バナナ", "いちご", "みかん"}
' 名前の文字数(長さ)が短い順に並び替えます
Dim sortedFruits = From f In fruits
Order By f.Length
Select f
For Each fruit In sortedFruits
Console.WriteLine(fruit)
Next
実行結果は以下の通りです。
りんご
バナナ
みかん
いちご
文字の長さだけでなく、アルファベット順や数値の大小など、あらゆる基準で並び替えが可能です。
5. 必要な部分だけ取り出す「Select」の役割
Select(セレクト)は、データの形を変えたり、特定の情報だけを抜き出したりするときに使います。例えば、社員情報という大きなデータの中から「名前だけ」を抜き出して新しいリストを作るようなイメージです。
初心者の方は「全部のデータが必要だから、いつもSelect n(そのまま選択)でいいのでは?」と思うかもしれませんが、大量のデータを扱うプログラミングでは、必要な情報だけに絞り込むことで動作を軽くする効果もあります。
6. メソッド構文とクエリ構文の違い
実は、LINQには2通りの書き方があります。一つは先ほどから使っている「SQL」というデータベース言語に似たクエリ構文、もう一つはドット(.)で命令を繋いでいくメソッド構文です。
メソッド構文は、numbers.Where(Function(n) n > 50)のように書きます。最初はクエリ構文の方が「英語の文章」のように読めるので理解しやすいでしょう。慣れてくると、どちらの書き方でも同じ結果が得られることが分かります。
7. ラムダ式:もっと短く書くためのコツ
メソッド構文を使う際にセットで登場するのがラムダ式です。これは、その場限りの小さな計算式のようなものです。Function(n) n * 2と書けば、「受け取った数字を2倍にする」という命令になります。
パソコンを触ったことがない方には少し難しく感じるかもしれませんが、「使い捨てのルール」だと考えてください。このルールをLINQの命令に渡すことで、自由自在にデータを加工できるようになります。
8. LINQを使うメリットと注意点
LINQを使う最大のメリットは、「何をするか」が明確になることです。ループ文(For Each)で書くと、「どうやって処理するか」という手順を細かく書く必要がありますが、LINQなら「これを探して、こう並べて」と宣言するだけで済みます。
注意点としては、非常に便利な反面、あまりにも巨大なデータ(数千万件など)に対して複雑なLINQを使いすぎると、少しだけ処理に時間がかかることがあります。しかし、学習段階や一般的なアプリ開発においては、その利便性がデメリットを大きく上回ります。
9. 文字列の抽出に挑戦してみよう
最後に、もう少し実戦に近い例を見てみましょう。「特定の文字から始まる単語だけを集める」という処理です。
Dim words As New List(Of String) From {"apple", "banana", "apricot", "cherry"}
' 「a」で始まる単語だけを抜き出します
Dim aWords = From w In words
Where w.StartsWith("a")
Select w
For Each word In aWords
Console.WriteLine(word)
Next
実行結果は以下の通りです。
apple
apricot
StartsWith(スターツ・ウィズ)という命令と組み合わせることで、「aから始まるもの」という条件を簡単に作ることができました。
10. LINQをマスターするための第一歩
LINQは一度にすべてを覚えようとする必要はありません。まずはWhereで絞り込み、Order Byで並び替える、この2つができるようになるだけで、あなたの書くプログラムは劇的に進化します。
プログラミング未経験の方は、まず「データを取り出すための魔法の呪文」があるんだな、という感覚で触れてみてください。自分で書いたコードが思い通りにデータを仕分けてくれたときの感動は、プログラミングの楽しさそのものです。