→第3回 LINQ勉強会
4時間ひたすらLINQのお話で内容ぎっしり。
にわかLINQerの自分はかなり必死に聞いていました。
とりあえず忘れないうちにメモ。
これまでのLINQ勉強会について
14:00~14:20 森理 麟さん(@moririring)いままでこんな活動してきたよ〜。とか
LINQ勉強会は三回目だよ〜。とかの紹介でした。
LINQ 概要 + 結構便利な LINQ to XML
14:20~15:20 青柳 臣一さん(@ShinichiAoyagi)LINQって?LINQの種類、LINQの書き方に始まり、
後半はLINQ to XMLの便利さについて語ってみえました。
LINQ to XML
W3Cの規定しているXmlDocumentとは全くの別物だそうな。キーワード:XDocument, XElement, XAttribute
System.Xml.Linq名前空間を使うらしい。
以下のようにしてXMLを作り出すことが可能。
var xml = new XDocument (new XElement ("AddressBook", new XElement ("Person", new XElement ("Name", "taro"), new XElement ("Age", 20)), new XElement ("Person", new XElement ("Name", "hanako"), new XElement ("Age", 20)) ));
これは楽そう。
VBだともっと変態的でソースコード上にいきなりXMLを書き始めることが可能らしい。
こうやって宣言したあとはもちろんLINQで使える。
var q = xml.Elements ("AddressBook").Elements () .Where (x => x.Element ("Name").Value == "taro");
ふむふむ。
さらに取り出すときにXElementを直接キャストできるそうな。
var q = xml.Elements ("AddressBook").Elements () .Where (x => (int)x.Element ("Age") == 20);
XElementクラスに主要な型へのキャストは大体定義してあるそうです。
もしElementがない場合などキャスト失敗するとException吐かれるんですが
Nullable型へキャストすればいいそうです。すんごい。
もしXPathを使いたい場合はSystem.Xml.XPath名前空間を使えばいいそう。
var qq = xml.XPathSelectElements ("/AddressBook/Person[Age=20]")....
XPath? 使ったこと無いし良くわからんですはい。
聞いた感じだとLINQ to XMLだけでいいような。
全体的にかなり分かりやすかったです。
ゆっくり進めてくれたしかな?
LINQ大好きなのが伝わってきましたw
もう一つのLINQ - Queryable入門
15:30~16:20 よねやんさん(@yone64)LINQ to SQLなどで使われるIQueryableを使ったLINQについての説明でした。 IEnumerableの方はいつも使ってますがIQueryableの知識は0だったのでとても面白かった。
EnumerableとQueryable
Enumerableはオンメモリ上の配列などを対象に順次評価していくのに対し、Queryableは外部のデータソースに対して問い合わせを行うための物。
例えばLINQ to SQL。
自分で実装する場合、
IQueryable<T>, IQueryProvider, IQueryProvider<T>などを書いていく。
IQueryableを使ったLINQで書いていくと
コンパイルしたときにExpressionTree(式木)というものが生成されるそうです。
実行時にはそれを元にQuery(SQLとか)が生成され、外部データソースに問い合わせされる感じらしい。
実際にATNDのWebAPIを対象としたLINQ実装を紹介していました。
大まかな流れは理解できたし一度書いてみようかなとは思ったけど
実際に使っていくかというとどうかなぁといった感じ。
ちょっと複雑になるだけでコーディング量倍増しそうな感じだったw
ちなみにILは基礎教養らしいです。
資料の最後に参考URLが載ってるので時間あるときに読んでみよう。
An Internal of LINQ to Objects
16:30~17:30 株式会社グラニ 取締役CTO ノイエさん(@neuecc)linq.jsとか作った世界的にもすごい人。
話し方も独特ですごい面白かったw
ひじょーに沢山の項目を話されてましたので気になったところだけ。
即時実行と遅延実行
・ToArray, First, Sum, などなどは即時実行・IEnumerable<T>を返すものは遅延実行
遅延実行される物はメモリ効率がよく好き放題繋いでも大丈夫。
・でも遅延実行=何度でも実行される可能性がある
ToArrayなどで実体化(Materialization)しよう。
・IEnumerator<T>を扱うときは必ずusingすること。
絶対。
Iterator復習
・IteratorはMoveNextのときに始めて実行される。・そのため引数チェックのタイミング注意。
・内部的に分離することで引数チェックを確実に行う。
安定ソート、非安定ソート
・OrderByはQuickSort・QuickSortは非安定ソート
・OrderByは安定ソート
ん?
シュワルツ変換?とかっていうイディオムを使って安定ソートを保証してるらしい。
OrderByを使ってシャッフル、最大値取得
seq.OrderBy(_ => Guid.NewGuid()); seq.OrderBy(x => x.Age).First(); seq.OrderByDescending(x=>x.Age).First();
SortにRandomを使うのは偏るらしいんだけどOrderByの仕組みを使えば大丈夫らしい。理由はよくわかんないけどすごい。MinMaxの取得も確かにこれ便利。
効率考えるとちゃんと別で実装すべきらしいけど手軽に使うなら十分みたい。
ToLookup
始めて聞いた。辞書のValue側がIEnumerableになってるものらしい。クエリ構文は要らない子
そんな気はしてた!
それAny
始めて聞いたけど笑ったw たしかにそのとおりだw
Where連打
Where連打は正義。楽しい。.Where(...).Where(...).Where(...)ってかいてると効率厨が沸いてくるらしい。
でもコンパイルすると&&に変換されるから大丈夫だって。すっげー。
この他にも色んなネタを話されてました。
資料のページ数を見るだけでも項目の多さが良くわかりますね。
どれも深く考察されててさすがだなーと思うばかりでした。
ここからはLT。
手積みでLINQ
アイライト 石野さん (@AILight)IQueryableを使ったLINQを使うために便利な関数を紹介されてました。
(...ちょっと理解追いつかなかったけど認識合ってるかな?)
組み込みでもLINQ
shagaさん (@shohaga).Net MicroFramework+LINQの紹介をされていました。
組み込み機器でもLINQ使えるなんて面白いなぁ。
Codeer Friendly
イッシーさん (@StoneGuitar777)PCの調子が悪かったようでテーマソングを流したのみでした。残念。
テスト自動化ツールのFriendlyというライブラリを開発されているそう。
懇親会でデモ見せてもらいましたが使い方次第で何でもできそう〜。
4時間みっちりとても勉強になりました。
IQueryableのあたりはよく分かってなかったので
イメージ掴めただけでも大収穫でした。
あとは勉強になったとともに自分はまだまだ勉強不足だなーと再認識。
がんばろー。