~第2回:LinqのGroupByにこんな機能が!?~2017.07.11どうもこんにちは。プログラマの田中智大です。7月になり今年も半分が過ぎました。今月は任天堂Switchと某イカのゲームが欲しいのですが、Switchがなかなか手に入らなくて苦労しています。欲しいですね・・・、任天堂Switch・・・・・さて、ブログの本題に入りますが、サーバーのデータベースにあるSQLデータを扱う時にC#のLinqってとても便利ですね。WhereとかSelectとか使ってると楽しいですよー!そんなある日、データをこんな形でGroupByしたい時がやってきました。これに対して私の書いたプログラムをご覧ください。実はよく調べると、今回の振り分ける機能は「使っているのはGroupByの機能だけではない!」ということなんです。いう事かをもう少し詳しく説明しましょう。TKey>)を使っています。キーを比較するために使用します。」と書かれていますが、これは具体的に言うと「キー同士の比較にはEqualityComparer<T>.Defaultプロパティが使われています」という事です。※ちなみにEqualityComperer<T>.DefaultはTの型のデフォルトの比較子を返します。TKey>のキーセレクタに匿名型を入れた場合、「匿名型のEqualsメソッド」でキーを比較するようになります。「すべてのプロパティが等しいとき」に等しいと判定されます(逆に言えば一つでもプロパティが異なれば、それは違うものと判定されます)さて、ここまでの説明から「なぜ匿名型を使う事で複数キーが分別できるか」の理由がお分かりいただけましたでしょうか?グループ分けの際に匿名型のプロパティが全て同じものでグループ分けを行っているため、複数のキーの組み合わせそれぞれでグループ分けができるんです。まとめ匿名型を使ったグループ分けは「GroupByが匿名型を使ったら複数のキーでグループ分けできる」というよりは「GroupByのキーセレクタに匿名型を使うと、その匿名型のEqualsメソッドでキーの振り分けを行っている」という形になります。確かにMSDNドキュメントには「匿名型を使うと複数キーでグループ分けできる」とは書いていませんでしたが、この機能は「GroupByはデフォルトのEqualsメソッドを使ってキーの判別を行っている」ということと「匿名型のEqualsメソッドはデフォルトで全てのプロパティが同じな場合に等しいと判定する」という二つの機能を合わせたものだったんですね!“言語の機能を理解するとできることの幅が広がる”とはこういうことなんだと実感します。おわりに入社して間も無い頃はLinqはおろか、IEnumerableすら何かわからなかった状態でした。先輩に教えてもらったり、ドキュメント読んで勉強したりしてだいぶ分かってきた今、Linqをとても楽しく使っています(目指せLinqマスター!)また新しい機能とか使い方勉強してどんどん使っていきたいですね!採用情報クラウドクリエイティブスタジオではエンジニアの方を絶賛募集中です。