[C# .Net] ちょっと上行くC#erになるためのLINQの使い方。

with コメントはまだありません

先日TOACHで紹介したLINQの入門記事は、おかげさまで多くの人に読んでもらえたようだ。

Hello LINQ world. 野暮ったいC#コードから卒業したいアナタへ。LINQ 基本の4つ。

このLINQの第一歩では、AnySelectWhereFirstOrDefaultという4つの基本的なメソッドを紹介した。

今回は、もう少し込み入ったことをするときに使えるメソッドを説明したい。

 

重複を取り除く -Distinct-

配列中の重複している要素を刈り込んで、ユニークな要素だけにしてくれるサッパリメソッド。

作例では、[0, 1, 2, 2, 3, 4] なる”2″が重複している配列にDistinctをかけ、[0, 1, 2, 3, 4]という重複のない状態にしている。

 

もちろん、数値以外にもこのメソッドは使える。

例えば、”c”が重複している配列を考えてみよう。この場合もほうらこのとおり。

無事に “a”, “b”, “c”なる配列を取得できた。

 

配列をDictionaryへ -ToDictionary-

配列やListからDictionaryを作るとき、もしかしてこんなコードを書いていないだろうか?

これは、数値配列をDictionaryへ変換するコードだけれど、こんなに単純なことをするためにこんなに行を費やす必要はない。LINQならこうなるのでR。

ToDictionary()の第一引数のラムダ式でDictionaryのキーを指定し、第二引数ではその値を決めている。

 

これを使うと、自作クラスを収めた配列をDictionary化するときなんかに威力が発揮される。

例えば、名前と年齢を持ったPersonというクラスを考える。

このクラスのインスタンスがいくつか入った配列を、名前をキーに、年齢をその値としたDictionaryを作りたい場合はこうなる。

キーとしてperson.Name、値としてperson.Ageを指定するだけの簡単工法。手抜きではありません。

 

昇順/降順に並べる -OrderBy, OrderByDescending-

最後に、Personインスタンスを年齢を基に昇順(年齢が高いほど後ろへ)と降順に並べる方法を見てみよう。

たった一行で年齢順にPersonを並べることができる。

大したことはしていないけれど、これをforループでやると地味に面倒な処理になってしまう。

大したことない処理を大したことない実装で実現する。まるで英語を読んでいるかのようにスラスラと。

それがLINQの目指すものなのかもしれない。

 

LINQの豊富な実用例を知りたい人にはこれがオススメ