SlideShare a Scribd company logo
Linqことはじめ
KLab株式会社 安井彰一
Linqとは
統合言語クエリ
(LINQ, Language INtegrated Query,
リンクと発音する)とは、
.NET Framework 3.5において、
様々な種類のデータ集合に対して
標準化された方法でデータを
問い合わせる(クエリ)ことを
可能にするために、
言語に統合された機能のことである。
開発ツールはVisual Studio 2008から対応している。
http://ja.wikipedia.org/wiki/統合言語クエリ
例題
問.テスト成績の平均が
30点未満の生徒の名前を求めよ
問.テスト成績の平均が
30点未満の生徒の名前を求めよ
students
.Where( x => x.TestResult.Average() < 30 )
.Select( x => x.Name )
students
// ↓平均点が30未満のものに絞り込む
.Where( x => x.TestResult.Average() < 30 )
// ↓ 名前への参照に変換する
.Select( x => x.Name )
問.テスト成績の平均が
30点未満の生徒を求めよ(別解)
from x in students
where x.TestResult.Average() < 30
select x.Name
from x in students
where x.TestResult.Average() < 30
select x.Name
↓ 似てる!
SELECT x.Name
FROM students AS x
WHERE AVG( 点数... ) < 30
LINQとは大量のデータを
いい感じに整形する処理を
簡単に書けるようにしたもの
LINQとは大量のデータを
いい感じに整形する処理を
簡単に書けるようにしたもの
どう簡単に?
先ほどの問題用のテストデータ
var students = new[]{
new{ name = "a", test = new[]{ 10, 20, 30 }.ToList() },
new{ name = "b", test = new[]{ 40, 50, 60 }.ToList() },
new{ name = "c", test = new[]{ 70, 80, 90 }.ToList() },
new{ name = "d", test = new[]{ 10, 10, 60 }.ToList() },
}
.Select( x =>
new Student(){ Name = x.name, TestResult = x.test } )
.ToList();
使い方
public class Data {
public List<Student> students = new List<Student>();
}
public static int Main() {
Data data = new Data(){ students = さっきのデータ };
IEnumerator<string> linq = data.students.さっきのLinq;
foreach ( var n in linq ) Debug.Log( n );
}
Output:
a
d
foreach ( var n in linq ) Debug.Log( n );
var newer = new Student(){
Name = "newer", TestResult = new[]{ 0,0,0 }.ToList() };
students.Add( newer );
foreach ( var n in linq ) Debug.Log( n );
Output
a
d
a
d
newer ← 同じIEnumerator<string>でも結果が違う
LINQとは、
シーケンス(どう処理するか)
を表したものであり、
処理をしたタイミングで結果が変わる。
重要な点
var value = datas
.Where( x => filter( x ) ) // 重いフィルター処理
.Select( x => convert( x ) ) // 重いコンバート処理
.FirstOrDefault();
この場合、重いfilterやconvertは
1度しか実行されません
なぜか
を解明するために中身を見ましょう。
public static IEnumerable<T> Where<T>(
this IEnumerable<T> self, Func<T, bool> f )
{
var e = self.GetEnumerator();
while( e.MoveNext() ) // ← 全シーケンスを走査
{
if ( f( e.Current ) ) // ← 条件を満たしていれば
{
yield return e.Current; // ← 次のシーケンスへ渡す
}
}
}
public static IEnumerable<TR> Select<T, TR>(
this IEnumerable<T> self, Func<T, TR> f )
{
var e = self.GetEnumerator();
while( e.MoveNext() ) // ← 全シーケンスを走査
{
yield return f( e.Current ); // ← 変換して次のシーケンスへ渡
す
}
}
public static T FirstOrDefault<T>( this IEnumerable<T> self )
{
var e = self.GetEnumerator();
if ( e.MoveNext() ) // ← 最初のシーケンスに移動できたら
// == 空のシーケンスでなければ
{
return e.Current; // ← 要素を返す
}
return default(T);
}
つまり
foreach ( var x in datas ) {
// ↓ Where( x => filter( x ) )
if ( false == filter( x ) ) continue;
// ↓ Select( x => convert( x ) )
var xx = convert( x );
// ↓ FirstOrDefault()
return xx;
}
return default(T); // ← FirstOrDefault()
と、同義!
つまり
foreachでやれ
LINQの何が
うれしいか
問.テスト成績の平均が
30点未満の生徒の名前を求めよ
students
.Where( x => x.TestResult.Average() < 30 )
.Select( x => x.Name )
問.テスト成績の平均が
30点未満の生徒のうち
名前が3文字以上の生徒の
名前を求めよ
問.テスト成績の平均が30点未満の
生徒のうち名前が3文字以上の生徒の
名前を求めよ
students
.Where( x => x.TestResult.Average() < 30 )
.Where( x => 3 <= x.Name.Length )
.Select( x => x.Name )
public class Data {
public List<Student> students = new List<Student>();
}
public static int Main() {
Data data = new Data(){ students = さっきのデータ };
IEnumerator<string> linq = data.students.さっきのLinq;
}
public class Data {
public List<Student> students = new List<Student>();
}
public static int Main() {
Data data = new Data(){ students = さっきのデータ };
IEnumerator<string> linq = data.students.さっきのLinq;
}
抽出条件の変更が
シーケンスの
定義部分だけで収まる
問.テスト成績の平均が30点未満の
生徒のうち名前が3文字以上の生徒の
名前とその人数を求めよ
students
.Where( x => x.TestResult.Average() < 30 )
.Where( x => 3 <= x.Name.Length )
.Select( x => x.Name )
var seq = students
.Where( x => x.TestResult.Average() < 30 )
.Where( x => 3 <= x.Name.Length );
var names = seq.Select( x => x.Name );
var count = seq.Count();
シーケンスは
使い回すことができる
使いたいと思ったら
MSDNへ!
https://msdn.microsoft.com/ja-
jp/library/system.linq.enumerable_methods(v=vs.110).aspx
ちなみに
iOSで落ちるのは
Monoの実装が
アレなだけで
LINQが悪いのではないです
フルで
使いたい人は
LINQ to iOS ( $40 )
https://www.assetstore.unity3d.c
om/jp/#!/content/18131
無料で
使いたい人は
自分で
拡張メソッドを
書きましょう

More Related Content

PDF
20120422i phonedeveloperworkshoppublished
PDF
Cocoa勉強会#43-Blocksを使う
PPTX
RubyとJavaScriptに見る第一級関数
PPTX
基礎構文班22回目 試験対策もどき
PDF
Swift らしい表現を目指そう #eventdots
PDF
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
PDF
関数型プログラミング in javascript
KEY
Clojure programming-chapter-2
20120422i phonedeveloperworkshoppublished
Cocoa勉強会#43-Blocksを使う
RubyとJavaScriptに見る第一級関数
基礎構文班22回目 試験対策もどき
Swift らしい表現を目指そう #eventdots
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
関数型プログラミング in javascript
Clojure programming-chapter-2

What's hot (18)

PDF
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
PDF
型推論
PDF
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
PDF
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
PDF
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
PDF
Introduction Xtend
PDF
WWDC 旅行の余談と Swift Open Hours 3 - Swift ラボで聞いてきた話 #cocoa_kansai
PPT
アルゴリズムとデータ構造2
PDF
Scalaで萌える関数型プログラミング[1.1.RC1]
PDF
たのしい高階関数
PDF
[第2版]Python機械学習プログラミング 第8章
PDF
データ構造と全探索
PDF
たのしい関数型
PPT
オブジェクト指向入門5
PPTX
こんなEqualsは嫌だ
PDF
[第2版]Python機械学習プログラミング 第14章
PDF
C++11のつかいかた
PPTX
基礎構文班19回目 変数のスコープとforの並び替え
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
型推論
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
Introduction Xtend
WWDC 旅行の余談と Swift Open Hours 3 - Swift ラボで聞いてきた話 #cocoa_kansai
アルゴリズムとデータ構造2
Scalaで萌える関数型プログラミング[1.1.RC1]
たのしい高階関数
[第2版]Python機械学習プログラミング 第8章
データ構造と全探索
たのしい関数型
オブジェクト指向入門5
こんなEqualsは嫌だ
[第2版]Python機械学習プログラミング 第14章
C++11のつかいかた
基礎構文班19回目 変数のスコープとforの並び替え
Ad

Similar to Linqことはじめ (20)

PPTX
C#を始めたばかりの人へのLINQ to Objects
PDF
LINQソースでGO!
PDF
Linq To Fun
PPTX
LINQ概要
PDF
VS勉強会 .NET Framework 入門
PPTX
Linqの速度測ってみた
PDF
Final LINQ Extensions
PPTX
20080201
PPTX
LINQ の概要とかもろもろ
PPTX
C# linq
PPTX
LINQ 概要 + 結構便利な LINQ to XML
PPTX
20071204
PPTX
超LINQ入門
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PPTX
LINQ雑談
PPTX
Visual Studio による開発環境・プログラミングの進化
PDF
An Internal of LINQ to Objects
PPTX
C# LINQ ~深く知って、使いまくろう~
PDF
MlnagoyaRx02
PDF
Let's LINQing! - C#におけるデータ処理 - by @masaru_b_cl #nds51
C#を始めたばかりの人へのLINQ to Objects
LINQソースでGO!
Linq To Fun
LINQ概要
VS勉強会 .NET Framework 入門
Linqの速度測ってみた
Final LINQ Extensions
20080201
LINQ の概要とかもろもろ
C# linq
LINQ 概要 + 結構便利な LINQ to XML
20071204
超LINQ入門
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
LINQ雑談
Visual Studio による開発環境・プログラミングの進化
An Internal of LINQ to Objects
C# LINQ ~深く知って、使いまくろう~
MlnagoyaRx02
Let's LINQing! - C#におけるデータ処理 - by @masaru_b_cl #nds51
Ad

Linqことはじめ