|
|
連載:[完全版]究極のC#プログラミング
Chapter16 LINQとメソッド構文
川俣 晶
2010/03/29 |
|
|
16.6 メソッド構文でのみ可能なクエリ
さて、すでに説明したとおり、クエリ式は糖衣構文であり、実体としての本体はメソッド構文となる。このことは、メソッド構文が用意されていても、糖衣構文が用意されていない機能は、クエリ式では記述できないことを意味する。
具体的な例を1つ紹介しよう(後でもう1つ紹介する)。
ここで取り上げるのはソースの順序を逆転する「Reverseメソッド」である。最初の項目が最後になり、最後の項目が最初になる。まず、これを単体で使った例を紹介しておこう(リスト16.7参照)。
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
int[] array = { 1, 2, 3 };
foreach (var n in array.Reverse())
{
Console.WriteLine(n);
}
// 出力:
// 3
// 2
// 1
}
}
|
|
リスト16.7 ソースの順序を逆転する |
「これが本当にクエリの機能か?」と疑問を持った読者もいると思うが、これはメソッド構文のクエリの中で使用する、れっきとしたクエリ関連の機能である。
たとえば、「守」という文字を含む名前のリストを抽出し、リストの最後の2人だけを取り出す処理を記述してみよう。ここで難しいのは、列挙において「最後の2つ」を抜き出す処理である。最後の1つを抜き出すだけならLastメソッドという便利なメソッドがあるのだが、いつ列挙が終わるか回数を事前に予測できないので、最後から2つ目の項目を、その項目が列挙された時点で確定するのは難しい。強いて書くなら、つねに列挙された最新の2つの項目を保持し続ける仕掛けを組み込む必要がある。
しかし、列挙の順番を逆転させると、比較にならないぐらい簡単になる。要するに、最初の2つを取り出せば、それが最後の2つなのである。このような処理は、Reverseメソッドが使用できるメソッド構文では容易に記述できる(リスト16.8参照)。
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
string[] array = { "押井守", "細田守", "神戸守", "湯山邦彦" };
var query = array.Where((n) => n.Contains('守')).Reverse();
int count = 0;
foreach (var name in query)
{
Console.WriteLine(name);
count++;
if (count >= 2) break;
}
// 出力:
// 神戸守
// 細田守
}
}
|
|
リスト16.8 「守」を含む名前のリストを抽出し、リストの最後の2人だけを取り出す |
Insider.NET 記事ランキング
本日
月間