SlideShare a Scribd company logo
1 of 34
LINQハンズオン
(初級編)
自己紹介
 名前: 並木 一真
 所属: 株式会社コンシスト
 仕事: 自社パッケージ製品(不動産スケルトンパッケージ)開発
 趣味: ゲーム、アニメ、ボルダリング
ハンズオンの流れ
 今日の目標 ・・・3分
 導入 ・・・30分
 LINQ概要 ・・・20分
 さっそく書いてみる(ハンズオンの中心) ・・・10分 + 20分
 LINQのコツ&注意点 ・・・15分
 まとめ&余談 ・・・5分
今日の目標
1. 「あっ、これハンズオンでやったところだ!」の
レベルになる。
2. 簡単なfor文if文をLINQで書いてみたくなる。
といいな・・・
ハンズオンコードはこちらから
(Visual Studio 2019推奨)
 https://github.com/namityo/LinqHandson
回答例はこちら
(gitのコミットログ見てね)
 https://github.com/namityo/LinqHandson/commit/d7394e346d9c5bbfd514f8
8bd7619778c029dc79
さっそくですが
プログラム書いてみてください(15分)
 数字の配列を受け取る関数(名前は「Hoge」)
 入力の配列のうち、5より大きい値の、最初の5個の総和を返す
※ .NETのクラスライブラリ使っていいですよ
あ、条件が二つ抜けてました・・・
(+5分)
 数字の配列を受け取る関数(名前は「Hoge」)
 入力の配列のうち、5より大きい値の、最初の5個の総和を返す
 入力の配列のうち、事前に10以上は除いてください
 5より大きい値のうち、2の倍数は2倍してください
何してるかぱっと見分かりますか?
なにやってるのかさっぱり・・・
何故読みにくいか?
 インデントが深い。
 条件とデータ変換が混在している。
 ブレイクやリターンで処理が中断している。
ほかにもあるかも・・・
インデントが深くなり、条件分岐が増えると抜けが無いか心配になる。
本当にコメントの通りか信用できなくなる。
こんなお悩みを解決できるのがLINQ!
 「クエリ構文」と「メソッド構文」がある。 最初のポイント!
※クエリ構文はSQLと勘違いしがちなので今回はやらない
今回のハンズオンはメソッド構文
LINQ概要
事前に覚えておくこと ~その1~
 IEnumerable <T>/IEnumerable(Of T)
 先頭から順番に値を取り出す IEnumerator を取得できるインタフェース
 Array、List、String などが実装している
 foreach できて LINQが使える
<<interface>>
IEnumerable
<<interface>>
IEnumerator
GetEnumerator()
List Array String
実装
?
LINQ概要
事前に覚えておくこと ~その1~
 IEnumerable <T>/IEnumerable(Of T)
 つまり
 foreach で使える
 LINQが使える
リストや配列、その他順次アクセスできるものはLINQが使える。
LINQの結果にもLINQが使える(ここが一番重要)
LINQ概要
事前に覚えておくこと ~その2~
 ラムダ式
 LINQのメソッド構文の引数はFunc<T, TResult> Delegate
 多くがリスト内のデータ1個を受け取って、真偽か値を返す。
 C#の場合
 引数 => 式
 VB.NETの場合
 Function(引数) 式
詳しく覚えなくても、
ハンズオンでLINQのメソッドと組み合わせで覚えればOK
?
ラムダ式はこんな感じ(C#)
ラムダ式変換の推移
ラムダ式はこんな感じ(VB.NET)
ラムダ式変換の推移
ここからハンズオン
・LinqHandsonLessonX のプロジェクトからソースを開いて実装する。
・スタートアッププロジェクトに設定する。
それっぽい場所に実装。
デバッグ実行で結果を確認。
ハンズオン
Q1 Selectでデータ変換
 引数の入力データを2倍して返す。
 C#
 VB.NET
ハンズオン
Q1 Selectでデータ変換(解説)
5 9 12 7 5 3 8 9
10 18 24 14 10 6 16 18
Select() 入ってきた数値を2倍する ラムダ式
ハンズオン
Q2 Whereで絞り込み
 引数の入力データの50より大きい値を返す。
 C#
 VB.NET
ハンズオン
Q2 Whereで絞り込み(解説)
66 48 70 3 100 22 92 11
66 70 100 92
Where() 50より大きい値 ラムダ式
ハンズオン
Q3 Order By で並び替え
 引数の入力データを数が大きい順で並び替える。
 C#
 VB.NET
ハンズオン
Q3 Order By で並び替え(解説)
66 48 70 3 100 22 92 11
OrderBy() 入力値 ラムダ式
3 11 22 48 66 70 92 100
ハンズオン
Q4 演習問題1
 入力の配列のうち、5より大きい値の、最初の5個を掛け算した値を返す
 入力の配列のうち、事前に10以上は除いてください
 5より大きい値のうち、2の倍数は2倍してください
・先頭からn個取り出すのは Take(n)
・数値の総和はSum()
・「2の倍数は2倍」は三項演算子
最初に書いたプログラムをLINQにすると
なんてわかりやすいんだ(棒)
ハンズオン
Q5 演習問題2
 入力の成績表のうち、国語の点数の男子上位3人の名前を表示せよ。
・Selectで次に渡す型が変えられる
このクラスが配列で渡されてくる
ハンズオン
Q6 演習問題3(オプション)
 入力の成績表から、「教科 平均点」を表示せよ。
・GroupByでまとめる
ハンズオン
Q7 演習問題4(オプション)
 入力の成績表のうち、いずれかの教科で30点以下の生徒を、点数の低い順で
「順位 名前」で表示せよ。 ※一番点数の低い人が1位
・Distinctで重複をなくす
・Selectのラムダ式で第2引数を取る
メソッド式の強み
 Select() でカウンターを取得できる。 ※Q7 演習問題4
 先頭は除くみたいなことが可能。クエリ式だとできない(と思う)
 IEnumerable に対して直接実行できるメソッドが多い。そのまま連結できる。
メソッド 簡単解説
ToList() LINQの結果をListにする。超使う。(理由は後述)
ToDictionary() LINQの結果からDictionaryを作る。結構使う。
Distinct() 重複を除く。ToDictionary()と合わせて使う。
が、匿名型のKey指定や、GetHashCode実装等のコツが必要。
Any() 1件以上あればTrueを返す。
FirstOrDefault() 最初の要素を取得する。
Concat() 二つの配列を連結して処理する。
メソッド式の弱点
 一時変数が利用できない。
 クエリ構文だと let で一時変数が利用可能。
 少し長くて複雑な条件を作るときに、一時変数が使えるクエリ構文の方が楽なケースがある。
 VB.NET だとラムダ式が長い。クソ言語。
LINQのコツ
 条件がいくつも存在する場合は Where を分ける
 Where の中で複雑なAnd条件を書くと読みにくくなるので注意
 forとifが出てきたらLINQの出番かも?
 LINQを使ってインデントを含めないことでバグを無くす。
 データ整理と目的の処理を分ける。
 for文、if文だと混在しがちな責任を分離することで、メンテナンスしやすくする。
LINQの注意点
 LINQの戻り値は IEnumerable<T>
 これは、LINQを実行した結果ではなくて、実行する予定のクエリである。
 Where や Select などのLINQ処理が利用される度に実行される。
 LINQの結果を Count() した後に for each でループする使い方をするとパフォーマンスを
落とすので要注意。(事前に ToList() でリストにしてしまう)
 IEnumerable<T> をpublicの戻りの型として使用しない方がいい。
 詳しくない人はLINQだと分からずに使う。上記のパフォーマンス低下が簡単に起こる。
 LINQは狭い範囲の利用に留めよう。
 コメントを残す
 LINQわからない人は読めない。
 敵を作らないために、どんなデータを取り出しているのかコメントを残す。
 逆に、コメントがあれば読めちゃうLINQ
まとめ
 LINQが出てきても、もうあんしん!
 for + if が出てきたらLINQを使うチャンスかも!
余談(中級・上級)
慣れてきたら幅が広がるLINQ
 Select + 匿名型 = インデックス付き foreach
 foreachなのに何番目かが取得できる。
 JOIN
 2つのデータ集合をJOINして処理することが出来る。
 例、DBのアクセス結果をCSVのデータと結合して処理
 ToDictionary()、ToHashSet()
 キャッシュを作るのに便利。
 拡張メソッドとYieldで自作LINQメソッド
 自分でLINQメソッド構文を作れます。(注意点2つ目の回避策にもなる)
 非同期PLINQ
 高負荷演算など非同期で動かすと、ある程度高速になる。

More Related Content

What's hot

ブループリント+ビジュアルスクリプトと仲良くやる方法
ブループリント+ビジュアルスクリプトと仲良くやる方法ブループリント+ビジュアルスクリプトと仲良くやる方法
ブループリント+ビジュアルスクリプトと仲良くやる方法Masahiko Nakamura
 
#VRSionUp! #1 ~高校生VRを国際会議へ VRChatを科学の研究に ボイスチェンジャ探求
#VRSionUp! #1 ~高校生VRを国際会議へ VRChatを科学の研究に ボイスチェンジャ探求#VRSionUp! #1 ~高校生VRを国際会議へ VRChatを科学の研究に ボイスチェンジャ探求
#VRSionUp! #1 ~高校生VRを国際会議へ VRChatを科学の研究に ボイスチェンジャ探求GREE VR Studio Lab
 
背景を作って苦労してみた ~Amplify Impostors~
背景を作って苦労してみた ~Amplify Impostors~背景を作って苦労してみた ~Amplify Impostors~
背景を作って苦労してみた ~Amplify Impostors~poko ponmaru
 
おれはコーディングをやめるぞ!
おれはコーディングをやめるぞ!おれはコーディングをやめるぞ!
おれはコーディングをやめるぞ!Daiki Egashira
 
ライティングについて 考えてみようの巻-公開版-
ライティングについて 考えてみようの巻-公開版-ライティングについて 考えてみようの巻-公開版-
ライティングについて 考えてみようの巻-公開版-poko ponmaru
 
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜narumi_
 
ゲームづくりで短期間でフロンドエンドのスキルアップ
ゲームづくりで短期間でフロンドエンドのスキルアップゲームづくりで短期間でフロンドエンドのスキルアップ
ゲームづくりで短期間でフロンドエンドのスキルアップTatsuya Kosuge
 
フレデリカが可愛いという話とARの話
フレデリカが可愛いという話とARの話フレデリカが可愛いという話とARの話
フレデリカが可愛いという話とARの話SaruKabuto
 
kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」
kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」
kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」kintone Café 名古屋支部
 
ゆるふわぱいそん
ゆるふわぱいそんゆるふわぱいそん
ゆるふわぱいそんyumi_chappy
 
Ggj2014に参加したカメのお話
Ggj2014に参加したカメのお話Ggj2014に参加したカメのお話
Ggj2014に参加したカメのお話勝成 鈴江
 
エンタメとテクノロジー
エンタメとテクノロジーエンタメとテクノロジー
エンタメとテクノロジーKiyoshi SASAGAWA
 
EP演習の正しい受け方
EP演習の正しい受け方EP演習の正しい受け方
EP演習の正しい受け方YukiAizawa1
 
超業火2本立て!スタンドアロンはいいぞスペシャル
超業火2本立て!スタンドアロンはいいぞスペシャル超業火2本立て!スタンドアロンはいいぞスペシャル
超業火2本立て!スタンドアロンはいいぞスペシャル陸弥 福田
 
Swift初心者がSpriteKitで一ヶ月でゲームを作った話
Swift初心者がSpriteKitで一ヶ月でゲームを作った話Swift初心者がSpriteKitで一ヶ月でゲームを作った話
Swift初心者がSpriteKitで一ヶ月でゲームを作った話Masaaki Kakimoto
 
誰でもVTuberになれるWebアプリFaceVTuberの立ち上げ話
誰でもVTuberになれるWebアプリFaceVTuberの立ち上げ話誰でもVTuberになれるWebアプリFaceVTuberの立ち上げ話
誰でもVTuberになれるWebアプリFaceVTuberの立ち上げ話Ryo Kurauchi
 
kintone Café 名古屋 Vol.3 「寂しくないKintone」
kintone Café 名古屋 Vol.3 「寂しくないKintone」kintone Café 名古屋 Vol.3 「寂しくないKintone」
kintone Café 名古屋 Vol.3 「寂しくないKintone」kintone Café 名古屋支部
 
【子ども向けハンズオン】 ゲームで学ぼう、プログラミング!
【子ども向けハンズオン】 ゲームで学ぼう、プログラミング! 【子ども向けハンズオン】 ゲームで学ぼう、プログラミング!
【子ども向けハンズオン】 ゲームで学ぼう、プログラミング! Java女子部
 
ペアプロとは? 20120331
ペアプロとは? 20120331ペアプロとは? 20120331
ペアプロとは? 20120331takepu
 

What's hot (20)

ブループリント+ビジュアルスクリプトと仲良くやる方法
ブループリント+ビジュアルスクリプトと仲良くやる方法ブループリント+ビジュアルスクリプトと仲良くやる方法
ブループリント+ビジュアルスクリプトと仲良くやる方法
 
#VRSionUp! #1 ~高校生VRを国際会議へ VRChatを科学の研究に ボイスチェンジャ探求
#VRSionUp! #1 ~高校生VRを国際会議へ VRChatを科学の研究に ボイスチェンジャ探求#VRSionUp! #1 ~高校生VRを国際会議へ VRChatを科学の研究に ボイスチェンジャ探求
#VRSionUp! #1 ~高校生VRを国際会議へ VRChatを科学の研究に ボイスチェンジャ探求
 
背景を作って苦労してみた ~Amplify Impostors~
背景を作って苦労してみた ~Amplify Impostors~背景を作って苦労してみた ~Amplify Impostors~
背景を作って苦労してみた ~Amplify Impostors~
 
おれはコーディングをやめるぞ!
おれはコーディングをやめるぞ!おれはコーディングをやめるぞ!
おれはコーディングをやめるぞ!
 
ライティングについて 考えてみようの巻-公開版-
ライティングについて 考えてみようの巻-公開版-ライティングについて 考えてみようの巻-公開版-
ライティングについて 考えてみようの巻-公開版-
 
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
 
ゲームづくりで短期間でフロンドエンドのスキルアップ
ゲームづくりで短期間でフロンドエンドのスキルアップゲームづくりで短期間でフロンドエンドのスキルアップ
ゲームづくりで短期間でフロンドエンドのスキルアップ
 
フレデリカが可愛いという話とARの話
フレデリカが可愛いという話とARの話フレデリカが可愛いという話とARの話
フレデリカが可愛いという話とARの話
 
kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」
kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」
kintone Café 名古屋 Vol.3 「マジでkintoneに恋する5秒前!?」
 
ゆるふわぱいそん
ゆるふわぱいそんゆるふわぱいそん
ゆるふわぱいそん
 
Ggj2014に参加したカメのお話
Ggj2014に参加したカメのお話Ggj2014に参加したカメのお話
Ggj2014に参加したカメのお話
 
エンタメとテクノロジー
エンタメとテクノロジーエンタメとテクノロジー
エンタメとテクノロジー
 
EP演習の正しい受け方
EP演習の正しい受け方EP演習の正しい受け方
EP演習の正しい受け方
 
超業火2本立て!スタンドアロンはいいぞスペシャル
超業火2本立て!スタンドアロンはいいぞスペシャル超業火2本立て!スタンドアロンはいいぞスペシャル
超業火2本立て!スタンドアロンはいいぞスペシャル
 
Bloodstainedで世界のバッカーの期待に応えたUE4事例紹介
Bloodstainedで世界のバッカーの期待に応えたUE4事例紹介Bloodstainedで世界のバッカーの期待に応えたUE4事例紹介
Bloodstainedで世界のバッカーの期待に応えたUE4事例紹介
 
Swift初心者がSpriteKitで一ヶ月でゲームを作った話
Swift初心者がSpriteKitで一ヶ月でゲームを作った話Swift初心者がSpriteKitで一ヶ月でゲームを作った話
Swift初心者がSpriteKitで一ヶ月でゲームを作った話
 
誰でもVTuberになれるWebアプリFaceVTuberの立ち上げ話
誰でもVTuberになれるWebアプリFaceVTuberの立ち上げ話誰でもVTuberになれるWebアプリFaceVTuberの立ち上げ話
誰でもVTuberになれるWebアプリFaceVTuberの立ち上げ話
 
kintone Café 名古屋 Vol.3 「寂しくないKintone」
kintone Café 名古屋 Vol.3 「寂しくないKintone」kintone Café 名古屋 Vol.3 「寂しくないKintone」
kintone Café 名古屋 Vol.3 「寂しくないKintone」
 
【子ども向けハンズオン】 ゲームで学ぼう、プログラミング!
【子ども向けハンズオン】 ゲームで学ぼう、プログラミング! 【子ども向けハンズオン】 ゲームで学ぼう、プログラミング!
【子ども向けハンズオン】 ゲームで学ぼう、プログラミング!
 
ペアプロとは? 20120331
ペアプロとは? 20120331ペアプロとは? 20120331
ペアプロとは? 20120331
 

Linq Hands-on