C#やるんならLINQ!!

この記事は TUT Advent Calendar 12日目の記事です!

 

みなさん、お久しぶりです。

技術ブログとして立ちあげましたが、全然記事書かないまま1年が過ぎました(べ、べつに書くネタがないわけじゃないんだからね

TUTに来て、新しい友達も増えて楽しい日々を送ってますよ。講義も後期から大幅に減ってUnityのアルバイト始めたり、趣味も新しく増えたり。もちろん今年のクリスマスも予定空いてますよ?

C#!!

さてさて、本題に入ります。C#便利ですよね。

プロパティ、ファイル操作、非同期処理、WPF、Azure・・・などなどWindows環境で動くソフトウェアに特化してます。最近ではUnityでも定着してますし、Visual Studioとの連携がよくとれているので自分のお気に入り言語ナンバーワンです。

 

そんな便利なC#LINQっていうの知ってますでしょうか??(九州の某アイドルではありませんよ

周りにちょこっと聞いてみましたが、初めて聞いたって人や、知らずに使ってた人などあんまり知られていないのかなと思いましたね。ですので、今回ぜひC#erにこの便利な機能を紹介したいと思い記事を書きました。

では逝きますか!(1919

LINQってそもそもなんぞや??

まずは、そもそもLINQって何者かを紹介します。

LINQはLanguage-Integrated Queryの略で日本語では、統合言語クエリと言われてます。

クエリって何?って思った方。クエリとは「問い合わせる」という意味で、一般的にデータの問い合わせ要求に使われます。一番わかりやすいのがデータベースとかですかね。あるデータベースにあるテーブルから、条件に合うカラムを持ってくる命令を1つの文字列として表現します。例えばこんなの

mealというテーブルから値段が1000円未満の商品名を出す、クエリーの例です。

こういう感じでデータの問い合わせに関する構文を並べるだけです。実はLINQもこれと同じで

 

データの問い合わせや更新をもっと楽にできるようにしよう!!

 

っというものです。じゃそのデータって何に対して言っているのかというと、配列・リスト・オブジェクトを指してます。

 

LINQにもいろいろ種類があります。

  • LINQ to Objects(配列、コレクション、任意のオブジェクト)
  • LINQ to Entities(Entity Framework経由でのデータベース)
  • LINQ to XML(ざむる)
  • LINQ to SQL(SQL サーバー)

今回はLINQ to Objectをメインにやっていきます。

何ができるの??

LINQの正体をざっと伝えたところで、何ができるかを紹介します。

LINQは配列やリストに対してデータの問い合わせ・更新などを楽にできるようにしようっというものでした。これらのデータ構造を使うっということは、あるデータを一時的に格納しておき、その要素に対して何か操作を行うってことです。

例えば、整数の入っているリストから5以上の整数リストを新しく欲しい時、こういう感じで書きませんか?

リストを反復構文で回してif文で条件に合う数値を新しいリストに追加しています。

なんか、単純なことをしているだけなのにこんなので10行近くも使っているのが、なんか嫌ではありませんかね?

しかし、LINQを使ってあげると以下のようになります。

gist.github.com

結果の表示をもうちょっと変えてみましょう。

gist.github.com

なんと、LINQを使ってあげることでここまで省略されました。10行使っていた処理が3行になりましたね。これが

データの問い合わせや更新をもっと楽にできるようにしよう!!

です。

コードをよく見ると反復構造であるforやforeachがありませんLINQを使うことによって書く必要性が無くなったんですね。

初めて見る方にとっては気持ちの悪い書き方であると思います。私もそうでした。しかし簡単な例から学んでいくと自然にこっちの書き方が欲しくなりますよ?(麻薬と一緒だね)

LINQとしてできることは、

 

forやforeach文を書かなくても
条件を満たす要素を抽出・更新・ソートなどができる!
 

です。そのためにLINQでは多くのメソッドが提供されています。

できることは、Sample1-3のような条件検索以外のもたくさんありますが。ここでは主に使うだろうものだけ書いておきます。

 

LINQを使ってみよう

じゃ、この便利なLINQをどうやって使えばいいのか。簡単です。ソースのusing欄に

using System.Linq;

これを追加するだけで、使えるようになります。Visual Studioの場合プロジェクトを作成すると自動的に追加されてるはずです。

 

ちなみに、LINQの処理をして結果を格納するとき返り値はList<T>にはなりません。IEnumerable<T>型になるので注意してください。

garicchi.hatenablog.jp

Select()

格納している要素1つずつに対して関数を適用して返します。情報数学で言う写像に似ています。

gist.github.com

サンプルでは、リストの要素に対して「x * x」という関数を適用して返しています。つまり2乗した数が返ってきます。

格納しているデータに対して加工を行うのは頻繁にあることなんで、覚えておきましょうね。

 

Where()

Sample1-3で出てきたWhere()です。これは、条件に合う要素をフィルタリングして返すっということをしています。

gist.github.com

サンプルでは、リストの要素のうち偶数である数値をフィルタリングして返しています。じゃ、AND演算のように複数条件はできるのか?できます

gist.github.com

先ほどの条件に5未満であるを追加しました。これで反復構造中のif文の代わりになります。

 

Count()

 特に説明することはなく、ただ要素数のサイズを取得します。

gist.github.com

 

Sort()

指定した要素でソートします。OrderBy()を使うことによって他クラスにある要素でのソートが可能になります。

gist.github.com

サンプルは、Playerクラスを作って要素としてHPと名前を持っています。リストの初期値にPlayerクラスを4つ挿入しておき、HP順とアルファベット順でそれぞれソートを行うものです。

実行結果は以下の通りで、きちんとHP順とアルファベット順でソートできていると分かります。

f:id:Collonville:20151212041907j:plain

降順にしたい場合はOrderByDescending()を使います。

 

その他

結構種類あるので紹介しきれないです。リンクを張っておきますので、各自で調べてみてください。

.Net(VB C#) LINQメソッド一覧:http://yan-note.blogspot.jp/2015/11/netvb-clinq.html

 

ちょっと応用

LINQの各メソッドはそれぞれ繋げることができます。例えば、リストにある要素を全て2倍にして14以下である数値が何個あるか調べる場合、

gist.github.com

このように

2倍する-->14以下である数をフィルタリングする-->数を数える

の流れが自然に組めるのもLINQの特徴の1つです。

 

遅延評価

本当ここがLINQの一番大事なところなんですが、正直もう書く気力がありませんのでまた別の記事に書きたいと思います。

 

まとめ

LINQはコレクションに対してデータの操作を簡単に記述できるようにするためのものです。そのおかげで、生産性やコードの可読性がぐぅんと上がります。

使うことができるメソッドが大量にあるので暇なときに調べてみると使えそうなものがヒットするかも。

 

明日はドイツの鳥で有名なあしゅりーさんの「座標で見る"TUT大学構内のレッドブル自販機100選"」です!。


あれ?TUT内にそんなに自販機あったけな????