15
LINQ雑談 西区プログラム勉強会 李充根

LINQ雑談

Embed Size (px)

Citation preview

Page 1: LINQ雑談

LINQ雑談西区プログラム勉強会 李充根

Page 2: LINQ雑談

LINQの雑談します

• C#勉強会の時発表したものの使い回しです(笑)

• 最近LINQを使ってみて面白かったので紹介します

• 去年までは全然使ったことなかったのでまだわからないことや曖昧なこといっぱいあるので変なところはお構いなく突っ込んでね

• C#勉強会の時は友人に「LINQよくわからん」と

言われました、わからないことは適宜聞いてください

Page 3: LINQ雑談

LINQとは?

• LinQ(リンク)は、2011年4月17日にデビューし

た福岡県福岡市を拠点に活動する日本のローカルアイドルグループ。

• 2012年のスローガンは「出ろ! しゃべれ! スベれ! 笑え! 馬鹿になれ! 笑う門には福来たる! 雑草アイドルLinQよ行くぞ!」である

(出典:wikipedia)

Page 4: LINQ雑談

LINQとは?

• 統合言語クエリ (LINQ, Language INtegratedQuery)とは、.NET Framework 3.5において、様々

な種類のデータ集合に対して標準化された方法でデータを問い合わせることを可能にする、言語に統合された機能のことである。開発ツールはVisual Studio 2008から対応している。

(出典:wikipedia)

Page 5: LINQ雑談

つまり?

• 簡単な書き方でデータの操作ができる

• SQL、XML、リストなどを操作できる

• 普通のメソッド構文(ラムダ式を使用)でもかけるけどクエリ構文で書くと簡単!

• 使わなきゃ損損!

• いつまで古い文法で縛られているの?(C#全般)

• delegate• event• ラムダ式• etc…

Page 6: LINQ雑談

書き方

• メソッド構文▫ 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的構文

ワンライナー!

可読性!

Page 7: LINQ雑談

ちなみに

• JavaでもJava8からラムダ式が採用されてStreamAPIが実装されているので似たようなことできるよ

• でも一度streamに変換しなきゃいけないしナンカ垢抜けてない……

• 詳しくはきしださんの記事を↓

• http://d.hatena.ne.jp/nowokay/20130504

Page 8: LINQ雑談

なんで使い始めたか?

• 数万件のCSVデータから数千件の検索用CSVとマッチするデータを抽出

• それと同時にアンマッチデータも抽出

• 社内で検討→excel?DB(SQL)?スクリプト?

• エクセルは面倒なので論外、DBに一旦入れて処理しても良かったけど客先にDB入れるの大変

• プログラム簡単に組んで処理しよう!

Page 9: LINQ雑談

よし、プログラムつくろう

• 最初はパッと書いてぱっと修正できるスクリプト言語を検討▫ そもそも俺あんまりスクリプトかけない

▫ (Pythonかじった程度、PHPは読むだけ、Ruby??)

• Java,C#ならわかる!▫ そういえばデータ操作ならLINQ便利らしい

SQLっぽいことやりつつデータの整形ができる

二つのデータのマッチもJOIN使えばすぐできる!

• LINQ使えば楽じゃん!

Page 10: LINQ雑談

使ってみて

• 予想以上に簡単にデータ処理ができる• 糖衣構文(クエリ構文)になっているから見やすい

• 一方▫ アンマッチデータの取得どうするんだ?▫ 最初は抽出データと検索データ照合したけどM*Nの時間がかかって遅い!

▫ (抽出がほぼ一瞬なのに対して数分かかる)

• vivisukeさんがN^2はダメでlog(N^2)までだよねって言ってたことが身を持って実感できたよ

Page 11: LINQ雑談

Twitterで嘆いたら

• すぐに面識のない人から返事が!▫ (LINQ星人ってボットが拾ってくるみたい)

▫ GroupJoinを使えばいいんだよ!

• GroupJoinはJoinしたものをグループでまとめてくれる

• DefaultIfEmptyでマッチしなかったデータも使えるのでアンマッチリストも作れる!

Page 12: LINQ雑談

結果

• 速度が数百倍!

• ほぼストレスなく実行できた

• その他

• 遅延評価(遅延実行?)→キャッシュないので重い処理は気をつけないと何度も実行される

• 回避するにはToList()でリスト化してしまう

Page 13: LINQ雑談

サンプルプログラム紹介

Page 14: LINQ雑談

その他

• Xamarin(mono)でももちろん使える▫ Xamarin for Android使えばAndroid開発でも使える

前回発表を参考

• 個人で開発する分ならいいけどグループで開発するにはみんなのスキル向上が必要▫ とは言ってもすでに.net4.5の時代だしそろそろみんな使えてもいいはず

• スクリプト言語で同じような処理したいな▫ 関数型使えばいいのかい?▫ Haskell勉強中

Page 15: LINQ雑談

ご清聴ありがとうがございました!