SlideShare a Scribd company logo
road to Linqulien
 米田 大介(三十路後半)
◦ 業務系のSEっポイことしてます。
◦ C#が好きです。
 でも、今業務ではVB.NETを書いてます。
◦ LINQが好き
 なので、VBでもLINQがかけるようになりました。
 Room Metroとかに、よくお世話になってます。
 とりあえず
ググる 福岡のアイド
ル?
コッチ
1. とりあえずコード書いてみましょう
2. リファクタリングしてみます。
3. なんと!? LINQがそこに。
最初はLINQなしでね
パチパチパチ
 Project Eulerに挑戦
◦ 問題1
 10未満の自然数のうち, 3 もしくは 5 の倍数になっている
ものは 3, 5, 6, 9 の4つがあり,これらの合計は 23 になる.
同じようにして, 1000 未満の 3 か 5 の倍数になっている
数字の合計を求めよ.
◦ 問題2
 フィボナッチ数列の項は前の2つの項の和である. 最初の2項
を 1, 2 とすれば, 最初の10項は以下の通りである.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万より小さい, 偶数値の項の総和を求め
よ.
 「Project Euler 日本語」で検索!!
public static int Problem1(int limit)
{
int sum = 0;
for (int i = 1; i < limit; i++)
{
if (i % 3 == 0 || i % 5 == 0)
{
sum += i;
}
}
return sum;
}
Public Function Problem1(ByVal limit As Integer)
Dim sum = 0
For i = 1 To limit - 1
If i Mod 3 = 0 OrElse i Mod 5 = 0 Then
sum += i
End If
Next
Return sum
End Function
public static int Problem2(int limit)
{
int sum = 0;
int a = 1;
int b = 1;
while (b < limit)
{
if (b % 2 == 0)
{
sum += b;
}
var temp = a;
a = b;
b = a + temp;
}
return sum;
}
Public Function Problem2(ByVal limit As Integer)
Dim sum = 0
Dim a = 1
Dim b = 1
While b < limit
If b Mod 2 = 0 Then
sum += b
End If
Dim temp = a
a = b
b = a + temp
End While
Return sum
End Function
public static int Problem1(int limit)
{
int sum = 0;
for (int i = 1; i < limit; i++)
{
if (i % 3 == 0 || i % 5 == 0)
{
sum += i;
}
}
return sum;
}
数列生成
終了条件
抽出条件
合計処理
public static int Problem2(int limit)
{
int sum = 0;
int a = 1;
int b = 1;
while (b < limit)
{
if (b % 2 == 0)
{
sum += b;
}
var temp = a;
a = b;
b = a + temp;
}
return sum;
}
数列生成
終了条件
抽出条件
合計処理
 現状の問題
◦ 処理が分散して、入り交じっている。
 これを
◦ 同じ処理はまとめる
◦ 違う処理は分ける
 なぜ?
◦ 再利用する
◦ 組み合わせ爆発を防ぐ
◦ わかりやすい
 同じコードは何度も書きたくない
◦ DRY
◦ 結果としてコードが短くなる
共通部分は、
メソッドにしたい
小難しい部分は、
ライブラリを呼ぶだけが
いい
 複雑さは乗数で増えていく。
◦ 何時、何処で、誰が、何をした。
自然数
フボナッチ
数
1000未満
400万未満
偶数
3か5で
割切れる
合計
平均
素数
先頭の100
個
標準偏差奇数番目
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
 分けたからわかりやすい
◦ 自然言語として、わかりやすい単位で分ける
◦ 適当な範囲で名前を付けられる
 数列生成部分を分けてみる
◦ 戻り値の型は?
 List or Array
 あらかじめ必要となる要素数が分かってないと、生成できない。
◦ じゃ、どうする?
 IEnumerable<T>
 列挙可能型
◦ 唯一のメソッドはGetEnumerator()
 MoveNextとCurrentを定義するIEnumerator<T>を返す
◦ List<T> / T[] 等、全てのコレクションの基底Inte
rface
◦ foreachで回せる
◦ 実際に値が必要になるときまで評価を遅延する実装が可
能
 可能とはいえ、遅延評価を行うクラスを実装するのは大変
 そこで、yieldですよ。
foreach (var item in collection)
ココに書ける
十分条件
 yield
◦ yeild return / yield break (C#)
◦ Iterator / Yeild (VB.NET)
◦ 列挙可能型を生成するためのシンタックスシュガー
 yieldの動作を見てみよう
◦ ハンズオン
◦ 時間があったらILSpyしてみる
public static IEnumerable<int> GetNaturalNumber()
{
int i = 0;
while (true)
{
yield return ++i;
}
}
public static IEnumerable<int> GetFibonacchiNumber()
{
int a = 1;
int b = 1;
while (true)
{
yield return b;
var temp = a;
a = b;
b = a + temp;
}
}
Public Iterator Function GetNaturalNumber() As IEnumerable(Of Integer)
Dim i As Integer = 0
While True
i = i + 1
Yield i
End While
End Function
Public Iterator Function GetFibonacchi() As IEnumerable(Of Integer)
Dim a = 1
Dim b = 1
While True
Yield b
Dim temp = a
a = b
b += temp
End While
End Function
public static int Problem1(int limit)
{
int sum = 0;
foreach (var i in GetNaturalNumber())
{
if (i < limit)
{
if (i % 3 == 0 || i % 5 == 0)
{
sum += i;
}
}
else
{
break;
}
}
return sum;
}
数列生成
終了条件
抽出条件
合計処理
public static int Problem2(int limit)
{
int sum = 0;
foreach (var i in GetFibonacchiNumber())
{
if (i < limit)
{
if (i % 2 == 0)
{
sum += i;
}
}
else
{
break;
}
}
return sum;
}
数列生成
終了条件
抽出条件
合計処理
 終了条件、抽出条件も分離してみる
◦ 戻り値の型は、数列生成同様IEnumerable<T>
◦ 引数は?
 数列と条件を渡したい
 条件って何型?
◦ intを引数に取り、boolを返すメソッド型
◦ つまりラムダ式を使う
 メソッドを簡易的に定義できる仕組み
 古くは
◦ デリゲート(C#1.0)
◦ 匿名メソッド(C#2.0)
 引数の型と数、戻り値の型がわかればOK
◦ ここでは、Func<int,bool>を
 いろいろラムダ式を書いてみよう
◦ ハンズオン
◦ 省略出来る部分の確認
3か5で割り切れる
 外側のMoveNextが、内
側のMoveNextを要求す
る。
 内側のCurrentの戻りに
よって、外側MoveNext
でTrueを返すか、False
を返すかを決定する
 全てが
IEnumereable<T>なの
で、いくつでも入れ子に
することができる。
1000未満
自然数
MoveNext
MoveNext
MoveNext
Current
Current
Current
 クラスのメソッドを擬似的に後から追加する仕組
み
 何が嬉しい?
◦ コードの記述順が処理順になる。
◦ インテリセンスの恩恵に預かれる。
public static int Problem1(int limit)
{
return GetNaturalNumber()
.TakeWhile(i => i < limit)
.Where(i => i % 3 == 0 || i % 5 == 0)
.Sum();
}
public static int Problem2(int limit)
{
return GetFibonacchiNumber()
.TakeWhile(i => i < limit)
.Where(i => i % 2 == 0)
.Sum();
}
Public Function Problem1(ByVal limit As Integer) As Integer
Return GetNaturalNumber().
TakeWhile(Function(i) i < limit).
Where(Function(i) i Mod 3 = 0 OrElse i Mod 5 = 0).
Sum()
End Function
Public Function Problem2(ByVal limit As Integer) As Integer
Return GetFibonacchi().
TakeWhile(Function(i) i < limit).
Where(Function(i) i Mod 2).
Sum()
End Function
 当然ながら、この辺のメソッドは、あらかじめ用
意されています。
 System.Linq名前空間を参照しましょう。
◦ TakeWhile
◦ Where
◦ Sum
 いつでもLINQが最適とは限らない
◦ コード上には現れないが、裏ではループが回っている
◦ ループしないで済む場合は、それで。
public static int Problem1(int limit)
{
Func<int, int> func = i =>
{
int count = (limit - 1) / i;
return (count + 1) * count / 2 * i;
};
return func(3) + func(5) - func(15);
}
 匿名型
◦ あらかじめ明示的に型を定義すること無く、読取専用プ
ロパティーを
 型推論
◦ 変数宣言の時、型情報を書かなくても、代入する値から
変数の型を推測し決定してくれる

More Related Content

PPTX
SQLアンチパターン読書会 09章 ラウンディングエラー
PDF
X hago2 shortcoding 20110827
PPTX
About chtMultiRegionFoam
PDF
C++によるソート入門
PDF
Javaセキュアコーディングセミナー東京第2回講義
PPTX
PDF
20120422i phonedeveloperworkshoppublished
SQLアンチパターン読書会 09章 ラウンディングエラー
X hago2 shortcoding 20110827
About chtMultiRegionFoam
C++によるソート入門
Javaセキュアコーディングセミナー東京第2回講義
20120422i phonedeveloperworkshoppublished

What's hot (12)

PPTX
即時関数
PDF
圏論とプログラミング読書会#2 資料
PDF
Define and expansion of cpp macro
PDF
君はまだ,本当のプリプロセスを知らない
PDF
Ruby紹介3(pdf)
PDF
Bluespec @waseda(PDF)
KEY
Clojure programming-chapter-2
PDF
競技プログラミングにおけるコードの書き方とその利便性
PDF
templateとautoの型推論
PDF
講座C入門
PDF
Vbaでもtdd
PDF
Emcjp item21
即時関数
圏論とプログラミング読書会#2 資料
Define and expansion of cpp macro
君はまだ,本当のプリプロセスを知らない
Ruby紹介3(pdf)
Bluespec @waseda(PDF)
Clojure programming-chapter-2
競技プログラミングにおけるコードの書き方とその利便性
templateとautoの型推論
講座C入門
Vbaでもtdd
Emcjp item21
Ad

Viewers also liked (20)

PPTX
とあるアプリの設計進化
PPTX
超Linq入門 実践編
PDF
Final LINQ Extensions II
PDF
Final LINQ Extensions
PDF
Final LINQ extensions III
PDF
LINQ基本のキ
PPTX
Reactive extensions
PPTX
Wpfと非同期
PPTX
XAML & XAML
PDF
Beachhead implements new opcode on CLR JIT
PPTX
C# LINQ入門
PPT
どこでも使えるF sharp again pub
PDF
Linqで画像処理
PPTX
C#でこなすexcel課題
PPTX
ランク6の俺がパズドラについて語る
PPTX
100枚の中から2枚を選ぶlightroom術
PPTX
Unityでlinqを使おう
PDF
Rx入門
PDF
LINQ in Unity
PDF
Reactive extensions入門v0.1
とあるアプリの設計進化
超Linq入門 実践編
Final LINQ Extensions II
Final LINQ Extensions
Final LINQ extensions III
LINQ基本のキ
Reactive extensions
Wpfと非同期
XAML & XAML
Beachhead implements new opcode on CLR JIT
C# LINQ入門
どこでも使えるF sharp again pub
Linqで画像処理
C#でこなすexcel課題
ランク6の俺がパズドラについて語る
100枚の中から2枚を選ぶlightroom術
Unityでlinqを使おう
Rx入門
LINQ in Unity
Reactive extensions入門v0.1
Ad

Similar to 超LINQ入門 (20)

ODP
Lt会01_uetch
PDF
新しくプログラミング言語・・・Rubyでやってみた
PDF
組み込みでこそC++を使う10の理由
PDF
オブジェクト指向できていますか?
PPT
Or seminar2011final
ODP
Boost9 session
PDF
El text.tokuron a(2019).watanabe190613
PPT
Gurobi python
PPTX
普通のコードがCodeGolfコードになるまで in Ruby
PPTX
最新C++事情 C++14-C++20 (2018年10月)
PDF
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
PPTX
C++14言語編
PDF
C++コミュニティーの中心でC++をDISる
PPTX
C言語 学習教材
PDF
Unity2015_No10_~UGUI&Audio~
PDF
【Unity道場スペシャル 2017札幌】乱数完全マスター
PPTX
Boost17 cpplinq
PDF
Processing資料(2) 再帰
PDF
20分くらいでわかった気分になれるC++20コルーチン
Lt会01_uetch
新しくプログラミング言語・・・Rubyでやってみた
組み込みでこそC++を使う10の理由
オブジェクト指向できていますか?
Or seminar2011final
Boost9 session
El text.tokuron a(2019).watanabe190613
Gurobi python
普通のコードがCodeGolfコードになるまで in Ruby
最新C++事情 C++14-C++20 (2018年10月)
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
C++14言語編
C++コミュニティーの中心でC++をDISる
C言語 学習教材
Unity2015_No10_~UGUI&Audio~
【Unity道場スペシャル 2017札幌】乱数完全マスター
Boost17 cpplinq
Processing資料(2) 再帰
20分くらいでわかった気分になれるC++20コルーチン

超LINQ入門