rider.お品書きサクッと書いて公開して、後でちまちま修正する事がママあります。なんじゃこりゃ?と思ったら、数日してから見て貰えると嬉しいです。「スクラムの実践方法を分かりやすくマンガも交えて解説。アルゴリズムヘルパーメソッド列挙子を列挙するときに、現在の位置が知りたい場合がある。頭の中にまだLINQの武器が少ないときは、諦めてfor文に逃げたりする。1));}LINQを使うなら、こういったループ制御構文を出来るだけ使わないようにする事だ。これが最終的に、ロジック重視の設計からデータドリブンの設計に移行するカギとなる。インデックスが必要なら、インデックスを列挙させれば良い。ToList();for文やforeach文で(ロジック的に)記述してしまうと、その後の応用性が失われてしまう。Enumerable.Rangeでインデックスの列挙子を生成すれば、結果は列挙子となる。上の例では早々にToListしてしまったが、もちろん、ここから続けて別のクエリを書く事が出来るし、そうすることでパイプライン実行が行われる。AsParallelすれば並列実行も出来る。応用性が全く違うというわけだ。ところで、上の例は元ネタとなるdataが配列であるので、要素数が分かる。Enumerable.Rangeでインデックスを生成できるのだが、配列である事を想定しているので詰めが甘い。ここは一つ、任意の列挙子で実現してみよう。置き換えるのであれば、以下のようになる。ToList();配列はIEnumerableを実装しているので、Count拡張メソッドを使って要素数を取得するのは間違っていない。Count拡張メソッドの実装は、対象がICollectionを実装していることを検知して、実際に列挙することなく要素数を得る事が出来るので、効率も良い。列挙子が配列ではない、任意の列挙子であった場合、しかもICollectionを実装していない場合は、一旦列挙を行って要素数を数え上げる。要素数を取得するだけならこれでも良いが、その直後、LINQクエリ内のElementAtで、また列挙を開始するため、二重に列挙を行っていることになる。コストについてピンと来ないかもしれないが、仮に列挙子がデータベースクエリを抽象化していると、データベースに対して2回のクエリ実行を行うことになる。Entitiesでこのような事をしないように)。value);}またしても、ヘルパー拡張メソッドだ。これを使えば、タプルクラスで作った「インデックス詰め合わせ」に変換できる。ToList();危ういロジック記述に頼ることなく、インデックスを保持する外部変数に頼ることなく、2回列挙することなく、クエリを簡便に記述可能になった。Indexingメソッドの実装もまたLINQクエリなので、返された列挙子は遅延実行される。パイプライン実行が可能ということだ。Formsで、コントロールの階層を親方向に辿りたいと思ったことがあるかも知れない。current.Parent;}この「while」を止めたいのだ。LINQに慣れてくると、「ループ終了条件」が正しいかどうかを、演算式だけで担保したくなる。whileやforやifによる制御構文があると、ロジックによる分岐が一々大丈夫かどうか確認するのが煩わしいし、ミスも生じやすくなる。「インデックスって0からだっけ、1だっけ?最後は”<"か"<="か?」とか、ifでこっちに行って、elseであっちに行ってとか、非常にうっとおしい。このようなループ制御を行っている場合は、うまく考えればクエリ化出来る。かなりのLINQクエリを書いているが、どうしてもループ制御構文を使わなければ実現できなかったコードは、ほんの僅かだった。この親コントロールをたどるwhileループは、要するに親までの一方向リンクをリスト化するということだ。}}このyield構文は、前回のyield構文と書き方は同じだが、メソッドが直接IEnumerableを返してしまう点で、更に強力だ。同時に、使い慣れていないと、メソッドが返却しているモノが一体何であるのか、混乱するかもしれない。この武器を使えば、リンクリストの追跡など、安全でたやすく、シンプルだ。:-)もちろん、型がControlである必要はない。リンク先がParentである必要もない。これらを担保するのは、ジェネリック引数とFuncデリゲートだ。任意のリンクリストをこのTraverseLink拡張メソッドでたどる事が出来る。06:35Tuple知らなかった。いつもkeyvalueか自力で作ってましたwTraversLinkの用な列挙を返せばLinqとの相性は良いですね、多分、最後の一行はラムダ式を使った方よりシンプルなるかと。:-)LINQは本当ネタが多くて、久しぶりにプログラミング言語の楽しさを味わってます。コメントは停止中です。WordPress%d人のブロガーが「いいね」をつけました。