C#のLINQにチャレンジしてみよう!

C#のLINQにチャレンジしてみよう!
基本情報技術者試験の試験対策はこちら>>

C#エンジニア 案件・求人一覧はこちら

C#のLINQとは?

C#のLINQとはLanguage-Integrated Queryの略で、配列変数やコレクションなどのデータ群から、条件文を指定してそれに合うデータを取り出す構文を意味します。データベースで使うSQLに似ていますが、違いもあります。

この記事ではSQLを知らない人でも理解できるようにわかりやすくご説明しますので、是非読んで役立ててください。

LINQの基本

まずは簡単な例から始めましょう。なおC#のLINQを使用するには、ソースコードの先頭にネームスペース指定の”using System.Linq;”を記述してください。

これを実行すると、コンソールに以下のように表示されます。ary配列の5以下の値が抽出されていますね。

4 2 5 0 3 1

クエリ構文とメソッド構文

上のサンプルプログラムのLINQクエリ構文の説明は以下になります。

C#のLINQはSQLに似ていると言いましたが、selectを最後にするのがSQLと違います。なおサンプルのクエリ構文は以下のようなメソッド構文にすることも可能です。=>はC#特有のラムダ式の表記法ですね。

この記事では、ラムダ式を使用しないシンプルなクエリ構文で説明します。

匿名型でLINQを使う

C#の匿名型に対してLINQを使うと分かりやすいコードを記述できます。以下が例です。

実行すると以下のように表示されます。

山田
阿部
佐藤

orderbyで昇順・降順のソートが可能

上のサンプルプログラムは名簿のうち男性だけをリストアップしてセカンドネームを取り出し、年齢の若い順(昇順)に並べて表示するという処理を行います。クエリ構文のorderbyで昇順にソートされます。

では降順にソートしたい場合はどうすれば良いのでしょうか。その場合は、

orderby row.Age descending

とすれば年齢の高い順(降順)に表示されます。なお昇順の場合は以下のようにしてもOKです。ascendingは省略できるということですね。

orderby row.Age ascending

intoでselect文を続ける

C#のクエリ構文はselectで終わりますが、その後にintoを追加するとさらに続けることができます。上のサンプルのクエリ文は以下のように記述しても同じ結果になります。

「男性をリストアップして、そのリストをさらに年齢の昇順でソートする」ということですね。この例では元のクエリより複雑になっていますが、クエリの条件が多い場合は役立つでしょう。

letでクエリの中で変数の代入が可能

letを使うとクエリ内で変数の計算と代入ができます。サンプルのクエリを以下のように修正してみてください。

結果は以下になります。

山田太郎
阿部伸介
佐藤一郎

クエリの中でも匿名クラスを生成できる

クエリの中でnewをして匿名クラスを生成することができます。サンプルのクエリ以降を以下のように修正してみてください。

これでletを使った時と同じ結果が表示されます。letを使うより、このようにクエリの外で計算をした方がやりやすい場合もあるでしょう。

Count、Max、Averageなどの使い方

C#のLINQのクエリは数値の項目に対して計算をすることもできます。以下はサンプルのhuman_tableの項目について様々な計算を行います。

結果は以下になります。他にも最小値を出すMin()や合計値を出すSum()もあるので試してみてください。

人数は 4人
最高年齢は 41才
平均年齢は 28.5才

AnyとAllの使い方

取得したデータが条件を満たすかどうかチェックするにはAnyとAllを使います。以下はサンプルのhuman_tableの項目について判定を行います。判定文の=>はラムダ式ですね。

結果は以下になります。human_tableの鈴木花子さんが18歳なのでAnyの条件はTrue、Allの条件はFalseになるということですね。

20歳未満がいるかどうか True
全員が20歳以上かどうか False

SelectManyで配列を取得できる

匿名型の配列にさらに配列が入っていた場合、それを取得するには以下のようにSelectManyを使います。なおLINQのこの機能はクエリ型でなくメソッド型で使用します。

このサンプルを実行すると以下のように表示されます。配列の中身がIEnumerableを実装しているコレクションとして取得されています。

サッカー
ゲーム
ゴルフ
カラオケ
バンド
競馬

joinで2つのデータを結合

joinを使うと2つのデータの共通点がある項目を結合することができます。ここまでのサンプルでhuman_tableとsyumi_tableという2つの匿名型の配列データが出てきましたが、これを結合してみましょう。join~in~on~equals~で可能です。以下がその例です。

human_tableとsyumi_tableのSecondNameは共通しているので、それが等しい箇所を結合します。実行すると以下のように表示されます。

太郎 サッカー
花子 ピアノ
一郎 ゴルフ
信介 バンド

group byで重複する箇所のあるデータをまとめる

例えばサンプルのsyumi_tableが以下のようになっていたら、SecondNameが同じ個所をまとめたいと思いますよね。

group byを使えば同じ箇所があるデータをまとめることができます。以下が例です。

結果は以下になります。resultはIGroupingを実装したコレクションで、中身の要素のKeyにgroup byでまとめたSecondNameが入っています。

山田 サッカー ゲーム
鈴木 ピアノ 読書

さいごに

C#のLINQについて理解できましたでしょうか。今回のサンプルでは匿名クラスの配列データが対象でしたが、LINQは他にもXMLドキュメントやSQLデータベースを対象にすることもできます。C#でデータ検索のプロフェッショナルを目指すなら、是非LINQをマスターしましょう。

C#エンジニア 案件・求人一覧はこちら

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。

合わせて読みたい

【組み込み】C#からPythonを呼び出す方法を紹介... hbspt.cta.load(20723875, '4d5ed975-c4a9-41ec-8e28-71f1d092cb5c', {"useNewLoader":"true","region":"na1"}); 組み込みとは? 一般に、特定の機能を家電製品や機械などに埋め込んで利用すること...
C#のswitch文を解説!if文との違いやさまざまな使い方を紹介... hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); C#のswitch文とは? まずはswitch文を使ってみよう C#にはs...
C#のdelegateでできることは?便利な使い方やラムダ式についても紹介... hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); C#のdelegateとは? C#にはdelegateという文法があります。...
C# でのforeach文の利用方法 hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); foreachとは? foreach文とは、配列やListに格...
C#のusingを活用しよう! hbspt.cta.load(20723875, 'd567c97b-58b2-483a-83fe-aec2e001739a', {"useNewLoader":"true","region":"na1"}); C#のusingとは? C#のプログラミングをする方は、usingを活用...