| 著作一覧 |
「Dave Provert」(soutaroにっき)の講義の実際。
さらにリンク先の登さんのところがおもしろい(本当に雑談なのだけど)。Priusに乗りたがるところとか。
#今日の薀蓄。HALはHardware Adaptation Layerが正しい。(だからどうというわけでもないけど、MS Pressの公式の呼び方と実際に作ってるところで名前が違うという点。確かにあるな)
今は資料が手元にあるので、セッションの内容を書いてみる(適当にこちらで再構成して、さらに省略してある)。
出発点
public class Foo {
public Foo(string r, int z) { bar = r; baz = z; }
string Bar;
int Baz;
}
public class Foos {
public static Foo[] GetItems() {
return new Foo[] { new Foo("a", 0), new Foo("b", 1), new Foo("c", 2) };
}
}
LINQは、SQL専用の構文ではなく、コレクションに対する統一した操作を提供するものだ。したがって、上のFoosを処理できなければならない。
var v = from foo in Foos.GetItems()
where foo.baz > 0
select new { foo.bar };
この結果としてvには
class ? {
public ?(string s) { bar = s; }
string bar;
}
?[] { new ?("b"), new ?("c") };
が入る。
foreach (var i in v) {
System.Console.WriteLine(i.
と打つとインテリセンスがbarを表示する。
var v = Foos.GetItems().Where(foo => foo.baz > 0).Select(foo => new { foo.bar, boo.baz});
ここで新たに加わった言語要素が、
varというローカル変数の型推論指定子WhereやSelectという外部メソッド(Foo[]がWhereを実装する必要があってはならないことは自明)をオブジェクトのメソッドルックアップの対象とする機構(拡張メソッド)=>ブロック本体)new { 初期化指定 }という無名型とその初期化構文
public static class Sequence
{
public static IEnumerable<T> Where<T>(IEnumerable<T> source, Func predicate) { ... }
...
}
というユーティリティを作ってそれを直接呼ばせる方法。そうすれば
var v = Sequence.Select(Sequence.Where(Foos.GetItems(), foo => foo.baz > 0), foo => new { foo.bar, boo.baz});
というようにスタティックメソッドのネストを利用することができる。#でも、この展開はコンパイラがLINQの構文から自動的に行うのだから、それほど必然性は無いようにも思えるな、今、思い返すと。
ただし、もしLINQ構文を利用しないのであれば、引数そのものにはインテリセンスは効かないのに対して、Foos.GetItems().と打った時点でWhereを出すことができる拡張メソッドのほうがVisual Studioを前提とした場合には望ましいということはわかる。
public static class Sequence
{
public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) { ... }
...
}
第1引数をthisで修飾すると、第1引数の型のメソッドルックアップテーブルにメソッドが追加される。ジェズイットを見習え |
「と打つとインテリセンスがbarを表示する。」で bar の code タグが閉じられていないので、以降全ての文字がcodeクオリティ(小さい)になっています。
修正しました。どうもありがとう。