|
|
連載:[完全版]究極のC#プログラミング
Chapter16 LINQとメソッド構文
川俣 晶
2010/03/29 |
|
|
16.7 メソッド構文のソート
さて、ここまでは、おおむねクエリ式の「句」とメソッド構文のメソッドが1対1に対応していた。しかし、1対1の対応が存在しないケースもある。たとえば、複数項目のソートはその一例である。次のリスト16.9は、前章でリスト15.11として紹介した絶対値の逆順ソート(複数のソート条件)のサンプルコードである。
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
int[] array = { -2, -1, 0, 1, 2 };
var query = from x in array
orderby Math.Abs(x) descending, x descending select x;
foreach (int n in query) Console.WriteLine(n);
// 出力:
// 2
// -2
// 1
// -1
// 0
}
}
|
|
リスト16.9 絶対値の逆順ソート(複数のソート条件) |
リスト16.9では、orderby句によって2つのソート条件が示されている。1つはMath.Abs(x)の降順(descending)、もう1つはxの降順(descending)である。
これをメソッド構文に置き換える場合、次のように記述する。
var query = array
.OrderByDescending((x) => Math.Abs(x))
.ThenByDescending(x => x)
.Select((x) => x);
|
|
まず、OrderByDescendingメソッドに注目しよう。orderby句は、メソッド構文では、昇順ならOrderByメソッド、降順ならOrderByDescendingメソッドに置き換えられる。ここでは降順なので、OrderByDescendingメソッドが指定されている。
ここまではよいだろう。問題はこの先である。このクエリ式は条件が2つ記述されているが、OrderByDescendingメソッドに指定できる条件は1つだけである。では2つ目の条件はどのように記述するのだろうか? その答えがThenByメソッド(昇順)またはThenByDescendingメソッド(降順)である。
上記のように、OrderBy(Descending)メソッドに続けてThenBy(Descending)メソッドを追加すれば、2つ目以降のソート条件を追加することができる。ThenBy(Descending)メソッドは2つ以上連続して記述してもよく、3つ以上のソート条件を付けることもできる。
このように、ソートを行う場合はクエリ式では見られないThenBy(Descending)という名前のメソッドを使用しなければならない。
Insider.NET 記事ランキング
本日
月間