Upload
lee-choong-geun
View
504
Download
4
Embed Size (px)
Citation preview
LINQ雑談西区プログラム勉強会 李充根
LINQの雑談します
• C#勉強会の時発表したものの使い回しです(笑)
• 最近LINQを使ってみて面白かったので紹介します
• 去年までは全然使ったことなかったのでまだわからないことや曖昧なこといっぱいあるので変なところはお構いなく突っ込んでね
• C#勉強会の時は友人に「LINQよくわからん」と
言われました、わからないことは適宜聞いてください
LINQとは?
• LinQ(リンク)は、2011年4月17日にデビューし
た福岡県福岡市を拠点に活動する日本のローカルアイドルグループ。
• 2012年のスローガンは「出ろ! しゃべれ! スベれ! 笑え! 馬鹿になれ! 笑う門には福来たる! 雑草アイドルLinQよ行くぞ!」である
(出典:wikipedia)
LINQとは?
• 統合言語クエリ (LINQ, Language INtegratedQuery)とは、.NET Framework 3.5において、様々
な種類のデータ集合に対して標準化された方法でデータを問い合わせることを可能にする、言語に統合された機能のことである。開発ツールはVisual Studio 2008から対応している。
(出典:wikipedia)
つまり?
• 簡単な書き方でデータの操作ができる
• SQL、XML、リストなどを操作できる
• 普通のメソッド構文(ラムダ式を使用)でもかけるけどクエリ構文で書くと簡単!
• 使わなきゃ損損!
• いつまで古い文法で縛られているの?(C#全般)
• delegate• event• ラムダ式• etc…
書き方
• メソッド構文▫ var hoge = numbers.Where(num => num % 2 == 0).OrderBy(n => n);
• クエリ構文▫ var hoge= from num in numbers
where num % 2 == 0
orderby num
select num;
ラムダ式 ラムダ式
SQL的構文
ワンライナー!
可読性!
ちなみに
• JavaでもJava8からラムダ式が採用されてStreamAPIが実装されているので似たようなことできるよ
• でも一度streamに変換しなきゃいけないしナンカ垢抜けてない……
• 詳しくはきしださんの記事を↓
• http://d.hatena.ne.jp/nowokay/20130504
なんで使い始めたか?
• 数万件のCSVデータから数千件の検索用CSVとマッチするデータを抽出
• それと同時にアンマッチデータも抽出
• 社内で検討→excel?DB(SQL)?スクリプト?
• エクセルは面倒なので論外、DBに一旦入れて処理しても良かったけど客先にDB入れるの大変
• プログラム簡単に組んで処理しよう!
よし、プログラムつくろう
• 最初はパッと書いてぱっと修正できるスクリプト言語を検討▫ そもそも俺あんまりスクリプトかけない
▫ (Pythonかじった程度、PHPは読むだけ、Ruby??)
• Java,C#ならわかる!▫ そういえばデータ操作ならLINQ便利らしい
SQLっぽいことやりつつデータの整形ができる
二つのデータのマッチもJOIN使えばすぐできる!
• LINQ使えば楽じゃん!
使ってみて
• 予想以上に簡単にデータ処理ができる• 糖衣構文(クエリ構文)になっているから見やすい
• 一方▫ アンマッチデータの取得どうするんだ?▫ 最初は抽出データと検索データ照合したけどM*Nの時間がかかって遅い!
▫ (抽出がほぼ一瞬なのに対して数分かかる)
• vivisukeさんがN^2はダメでlog(N^2)までだよねって言ってたことが身を持って実感できたよ
Twitterで嘆いたら
• すぐに面識のない人から返事が!▫ (LINQ星人ってボットが拾ってくるみたい)
▫ GroupJoinを使えばいいんだよ!
• GroupJoinはJoinしたものをグループでまとめてくれる
• DefaultIfEmptyでマッチしなかったデータも使えるのでアンマッチリストも作れる!
結果
• 速度が数百倍!
• ほぼストレスなく実行できた
• その他
• 遅延評価(遅延実行?)→キャッシュないので重い処理は気をつけないと何度も実行される
• 回避するにはToList()でリスト化してしまう
サンプルプログラム紹介
その他
• Xamarin(mono)でももちろん使える▫ Xamarin for Android使えばAndroid開発でも使える
前回発表を参考
• 個人で開発する分ならいいけどグループで開発するにはみんなのスキル向上が必要▫ とは言ってもすでに.net4.5の時代だしそろそろみんな使えてもいいはず
• スクリプト言語で同じような処理したいな▫ 関数型使えばいいのかい?▫ Haskell勉強中
ご清聴ありがとうがございました!