|
|
連載:[完全版]究極のC#プログラミング
Chapter15 LINQとクエリ式
川俣 晶
2010/03/17 |
|
|
15.13 クエリの接続
次のリスト15.13のようなクエリ式があったとしよう。このクエリ式は、1から10までの整数を2乗した値が50を超えるもののみを選び出す。
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var query = from n in Enumerable.Range(1, 10)
where n * n > 50 select n * n;
foreach (int n in query) Console.WriteLine(n);
// 出力:
// 64
// 81
// 100
}
}
|
|
リスト15.13 1から10までの整数を2乗した値のうち50を超える数値のみを抽出 |
しかし、この式には「n * n」という計算が2回出てきて冗長である。この計算を1つにするには、たとえば、次ページのリスト15.14のように、「1から10までの整数を2乗した値」のシーケンスを得るクエリ式と値が50を超えるもののみを選び出すクエリ式を分離すればよい。
var query1 = from n in Enumerable.Range(1,10) select n * n;
var query2 = from m in query1 where m > 50 select m;
foreach (int n in query2) Console.WriteLine(n);
|
|
リスト15.14 2つのクエリ式に分離 |
これで「n * n」は1つになった。
だが、これはこれでクエリ式が2つあり、別の意味で冗長である。ここで、into句を使うと、1つのクエリの結果を別のクエリのソースとすることができる。つまり、2つのクエリ式をinto句で接続することで、これを1つのクエリ式にまとめることができる(リスト15.15参照)。
var query = from n in Enumerable.Range(1,10)
select n * n into m where m > 50 select m;
|
|
リスト15.15 2つのクエリをinto句により接続 |
この例で、「from n in ……」がソースからの入力を範囲変数nで受けるのと同様に、「…… into m」は手前のクエリ式の結果を範囲変数mで受けている。それにより、「m > 50」という条件判断が可能となっている。
Insider.NET 記事ランキング
本日
月間