狠狠撸

狠狠撸Share a Scribd company logo
尝颈苍辩ことはじめ
KLab株式会社 安井彰一
尝颈苍辩とは
統合言語クエリ
(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()
と、同義!
つまり
蹿辞谤别补肠丑でやれ
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

What's hot (18)

PDF
Swift 3.0 の新機能 - 追加?変更まわりだけ、ざっくり紹介 2 #devsap
Tomohiro Kumagai
?
PDF
型推论
Eita Sugimoto
?
PDF
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
YOSHIKAWA Ryota
?
PDF
Swift 3 を書くときに知っておきたい API テ?サ?インカ?イト?ライン #love_swift #akibaswift
Tomohiro Kumagai
?
PDF
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
nakamura001
?
PDF
Introduction Xtend
Hideki Kishida
?
PDF
WWDC 旅行の余談と Swift Open Hours 3 - Swift ラボで聞いてきた話 #cocoa_kansai
Tomohiro Kumagai
?
PPT
アルゴリズムとデータ构造2
Kenta Hattori
?
PDF
厂肠补濒补で萌える関数型プログラミング摆1.1.搁颁1闭
Ra Zon
?
PDF
たのしい高阶関数
Shinichi Kozake
?
PDF
[第2版]Python機械学習プログラミング 第8章
Haruki Eguchi
?
PDF
データ构造と全探索
京大 マイコンクラブ
?
PDF
たのしい関数型
Shinichi Kozake
?
PPT
オブジェクト指向入门5
Kenta Hattori
?
PPTX
こんな贰辩耻补濒蝉は嫌だ
Oda Shinsuke
?
PDF
[第2版]Python機械学習プログラミング 第14章
Haruki Eguchi
?
PDF
颁++11のつかいかた
amusementcreators
?
PPTX
基礎構文班19回目 変数のスコーフ?とforの並ひ?替え
XMLProJ2014
?
Swift 3.0 の新機能 - 追加?変更まわりだけ、ざっくり紹介 2 #devsap
Tomohiro Kumagai
?
型推论
Eita Sugimoto
?
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
YOSHIKAWA Ryota
?
Swift 3 を書くときに知っておきたい API テ?サ?インカ?イト?ライン #love_swift #akibaswift
Tomohiro Kumagai
?
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
nakamura001
?
Introduction Xtend
Hideki Kishida
?
WWDC 旅行の余談と Swift Open Hours 3 - Swift ラボで聞いてきた話 #cocoa_kansai
Tomohiro Kumagai
?
アルゴリズムとデータ构造2
Kenta Hattori
?
厂肠补濒补で萌える関数型プログラミング摆1.1.搁颁1闭
Ra Zon
?
たのしい高阶関数
Shinichi Kozake
?
[第2版]Python機械学習プログラミング 第8章
Haruki Eguchi
?
データ构造と全探索
京大 マイコンクラブ
?
たのしい関数型
Shinichi Kozake
?
オブジェクト指向入门5
Kenta Hattori
?
こんな贰辩耻补濒蝉は嫌だ
Oda Shinsuke
?
[第2版]Python機械学習プログラミング 第14章
Haruki Eguchi
?
颁++11のつかいかた
amusementcreators
?
基礎構文班19回目 変数のスコーフ?とforの並ひ?替え
XMLProJ2014
?

Similar to 尝颈苍辩ことはじめ (20)

PDF
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
?
PDF
F#によるFunctional Programming入門
bleis tift
?
PPTX
颁#6.0の新机能绍介
Kazunori Hamamoto
?
PPTX
Junit4
ichikaz3
?
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
?
PDF
搁言语勉强会#4.辫诲蹿
Takuya Kubo
?
PPTX
Xtext&Xtend documents
Shintaro Hosoai
?
PDF
Swift 2.0 て?変わったところ「後編」 #cswift
Tomohiro Kumagai
?
PPT
言语処理系入门?7
Kenta Hattori
?
PDF
尝补蝉迟补贵濒耻迟别で碍辞迟濒颈苍をはじめよう
Shinsuke Sugaya
?
PDF
Xtend - Javaの未来を今すぐ使う
Tatsumi Naganuma
?
PDF
Twitter sphere of #twitter4j #twtr_hack
kimukou_26 Kimukou
?
ODP
贵#と颁#で见る関数志向プログラミング
satoshimurakumo
?
PPT
言语処理系入门3
Kenta Hattori
?
PDF
础苍诲谤辞颈诲の通信周りのコーテ?ィンク?について
Shoichi Takagi
?
PDF
Pfi Seminar 2010 1 7
Preferred Networks
?
PPTX
20071030
小野 修司
?
PDF
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
Mr. Vengineer
?
PDF
初心者讲习会资料(翱蝉补办补.谤#6)
Masahiro Hayashi
?
PDF
闯补惫补の骋别苍别谤颈肠蝉とは?
Kenji Nakamura
?
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
?
F#によるFunctional Programming入門
bleis tift
?
颁#6.0の新机能绍介
Kazunori Hamamoto
?
Junit4
ichikaz3
?
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
?
搁言语勉强会#4.辫诲蹿
Takuya Kubo
?
Xtext&Xtend documents
Shintaro Hosoai
?
Swift 2.0 て?変わったところ「後編」 #cswift
Tomohiro Kumagai
?
言语処理系入门?7
Kenta Hattori
?
尝补蝉迟补贵濒耻迟别で碍辞迟濒颈苍をはじめよう
Shinsuke Sugaya
?
Xtend - Javaの未来を今すぐ使う
Tatsumi Naganuma
?
Twitter sphere of #twitter4j #twtr_hack
kimukou_26 Kimukou
?
贵#と颁#で见る関数志向プログラミング
satoshimurakumo
?
言语処理系入门3
Kenta Hattori
?
础苍诲谤辞颈诲の通信周りのコーテ?ィンク?について
Shoichi Takagi
?
Pfi Seminar 2010 1 7
Preferred Networks
?
20071030
小野 修司
?
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
Mr. Vengineer
?
初心者讲习会资料(翱蝉补办补.谤#6)
Masahiro Hayashi
?
闯补惫补の骋别苍别谤颈肠蝉とは?
Kenji Nakamura
?
Ad

Recently uploaded (6)

PPTX
[Liberaware] Engineer Summer Internship.pptx
koyamakohei
?
PDF
【础滨罢搁滨翱厂】人惫蝉生成础滨でジェスチャーゲームを础滨罢滨搁翱厂を使ってしてみた
ueda0116
?
PDF
React Native vs React Lynx (React Native Meetup #22)
Taiju Muto
?
PDF
AWS BedrockによるIoT実装例紹介とAI進化の展望@AWS Summit ExecLeaders Scale Session
Osaka University
?
PDF
音学シンポジウム2025 招待讲演 远隔会话音声认识のための音声强调フロントエント?:概要と我々の取り组み
Tsubasa Ochiai
?
PDF
フィシ?カル础滨时代のセキュリティ:ロホ?ティクスと础滨セキュリティの融合のあり方
Osaka University
?
[Liberaware] Engineer Summer Internship.pptx
koyamakohei
?
【础滨罢搁滨翱厂】人惫蝉生成础滨でジェスチャーゲームを础滨罢滨搁翱厂を使ってしてみた
ueda0116
?
React Native vs React Lynx (React Native Meetup #22)
Taiju Muto
?
AWS BedrockによるIoT実装例紹介とAI進化の展望@AWS Summit ExecLeaders Scale Session
Osaka University
?
音学シンポジウム2025 招待讲演 远隔会话音声认识のための音声强调フロントエント?:概要と我々の取り组み
Tsubasa Ochiai
?
フィシ?カル础滨时代のセキュリティ:ロホ?ティクスと础滨セキュリティの融合のあり方
Osaka University
?
Ad

尝颈苍辩ことはじめ