C#のLINQクエリ構文の書き方と基本操作をマスターしよう
生徒
「先生、C#で大量のデータの中から、特定の条件に合うものだけを取り出したり、並べ替えたりする簡単な方法はありますか?」
先生
「それなら『LINQ(リンク)』という機能がぴったりですよ。まるでデータベースに命令を出すように、直感的にデータを操作できるんです。」
生徒
「難しそうですね…。初心者でもすぐに使えるようになりますか?」
先生
「大丈夫です!書き方のパターンさえ覚えれば、驚くほどコードがスッキリします。さっそく、LINQの魔法を学んでいきましょう!」
1. LINQ(リンク)とは何か?
C#を学習していると、たくさんのデータ(リストや配列といいます)を扱う場面が必ず出てきます。例えば、「テストの点数一覧から80点以上の人だけを探す」とか「名前をアルファベット順に並べ替える」といった作業です。これらを普通の繰り返し処理(for文やforeach文)で書くと、コードが長くなってしまいがちです。
そこで登場するのがLINQ(Language Integrated Query:統合言語クエリ)です。LINQを使うと、データに対して「何をしてほしいか」を短い文章のような形式で書くことができます。パソコンをあまり触ったことがない方でも、料理のレシピを注文するようにプログラムを書けるとイメージすれば分かりやすいでしょう。
LINQには大きく分けて「クエリ構文」と「メソッド構文」の2つの書き方がありますが、今回はより英語の文章に近く、初心者の方にも意味が理解しやすいクエリ構文を中心に解説します。
2. LINQクエリ構文の基本形を覚えよう
クエリ構文は、まるで「どこそこの棚から、この条件に合うものを選んで、最後に渡して」と指示を出すような書き方をします。基本となるキーワードは3つです。
- from:どのデータ(箱)から取り出すかを指定します。
- where:どんな条件で絞り込むかを指定します。
- select:最終的にどのデータを取り出すかを指定します。
まずは、簡単な数字のリストから「5より大きい数字」だけを取り出すプログラムを見てみましょう。
using System;
using System.Collections.Generic;
using System.Linq; // LINQを使うために必要です
class Program
{
static void Main()
{
// 1. 元となるデータ(数字のリスト)を用意します
List<int> numbers = new List<int> { 1, 3, 5, 7, 9 };
// 2. LINQクエリ構文を使って、5より大きい数字を探します
var query = from n in numbers
where n > 5
select n;
// 3. 結果を表示します
Console.WriteLine("5より大きい数字は:");
foreach (var item in query)
{
Console.WriteLine(item);
}
}
}
実行結果は以下のようになります。
5より大きい数字は:
7
9
このコードの中で from n in numbers という部分があります。これは「numbersというリストの中にある一つ一つの数字を、とりあえず n と呼ぶことにするよ」という意味です。これを範囲変数と呼びます。そして where n > 5 で「 n が5より大きい場合だけ」と条件を付け、最後に select n でその n を結果として出力しています。
3. データを並べ替える「orderby」の使い方
次に、バラバラに並んでいるデータを順番通りに整列させる方法を学びましょう。これを並べ替え(ソート)と言います。LINQでは orderby というキーワードを使います。
例えば、名前のリストを五十音順(昇順)や、その逆(降順)に並べ替えることができます。デフォルト(標準)では小さい順になりますが、大きい順にしたいときは descending という言葉を後ろに付けます。
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<string> names = new List<string> { "さとう", "あべ", "たなか", "いとう" };
// あいうえお順(昇順)に並べ替えます
var sortedNames = from name in names
orderby name
select name;
Console.WriteLine("並べ替え後の名前:");
foreach (var n in sortedNames)
{
Console.WriteLine(n);
}
}
}
並べ替え後の名前:
あべ
いとう
さとう
たなか
このように、複雑な並べ替えも orderby 一つで解決します。もし逆順にしたい場合は orderby name descending と書くだけで済みます。プログラミング未経験の方でも、この英単語の意味を知っていれば、何をしているコードなのか予測がつくのがLINQの素晴らしい点です。
4. 複数の条件で絞り込む
現実のデータ操作では、条件が一つだけとは限りません。「10以上かつ、偶数(2で割り切れる数)のもの」といったように、複数の条件を組み合わせたいことがあります。その場合は、 where の中で && (かつ)や || (または)を使います。
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<int> scores = new List<int> { 45, 78, 90, 20, 66, 100 };
// 60点以上、かつ100点満点ではない人を探す
var result = from s in scores
where s >= 60 && s < 100
select s;
Console.WriteLine("合格点かつ満点以外:");
foreach (var s in result)
{
Console.WriteLine(s);
}
}
}
合格点かつ満点以外:
78
90
66
このように、 && を使うことで「条件Aと条件Bの両方を満たすもの」を簡単に抽出できます。これはExcelのフィルター機能を使っている感覚に非常に近いです。
5. データを加工して取り出す
最後に応用編として、 select を使ったデータの加工について解説します。これまでは select n のように、元のデータをそのまま取り出していましたが、実は取り出す瞬間にデータを加工することができます。
例えば、「名前のリストを取り出すときに、全員の名前に『様』を付ける」といった操作です。
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<string> fruits = new List<string> { "りんご", "みかん", "ばなな" };
// 全ての名前に「おいしい」を付けて取り出す
var deliciousFruits = from f in fruits
select "おいしい" + f;
foreach (var item in deliciousFruits)
{
Console.WriteLine(item);
}
}
}
おいしいりんご
おいしいみかん
おいしいばなな
この「加工」ができるようになると、複雑なオブジェクト(例えば、会員番号・名前・住所が入った大きなデータ)から「名前だけを抜き出した新しいリスト」を作る、といったことが非常に簡単にできるようになります。データのクエリ(問い合わせ)を行う際に、必要な形に整えてから受け取ることができるため、その後のプログラムが非常に作りやすくなります。
6. LINQを使うメリット
なぜ世界中のプログラマーがLINQを愛用するのでしょうか?それは、「コードが読みやすくなるから」に尽きます。もしLINQを使わずに同じことをしようとすると、新しいリストを作成し、for文で一つずつ中身をチェックし、if文で判定し、条件に合えば新しいリストに Add (追加)する…という何行にもわたる処理を書かなければなりません。
しかし、LINQなら「何を探しているのか」がひと目で分かります。これは、将来自分が書いたコードを読み返したときや、他の人と一緒に開発をするときに、ミスを減らすための非常に重要なポイントとなります。また、LINQはリストだけでなく、配列、XML、データベースなど、様々な種類のデータに対して同じ書き方で使えるという魔法のような汎用性を持っています。
最初は from や select といった書き方に戸惑うかもしれませんが、何度も書いているうちに、自然と手が動くようになります。まずは身近な数字や文字列のリストを使って、色々な条件でデータを抜き出す練習をしてみましょう。それが、効率的なC#プログラミングへの第一歩となります。