連載:[完全版]究極のC#プログラミング

Chapter16 LINQとメソッド構文

川俣 晶
2010/03/29
Page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

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)という名前のメソッドを使用しなければならない。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter16 LINQとメソッド構文
    1.16.1 予約語のエスケープ
    2.16.2 メソッド構文のLINQ
    3.16.3 クエリ式とメソッド構文の違い
    4.16.4 絞り込みと結果の生成
    5.16.5 最初の事例の別解
    6.16.6 メソッド構文でのみ可能なクエリ
  7.16.7 メソッド構文のソート
    8.16.8 orderbyの比較オブジェクト
    9.16.9 メソッド構文の複数のソースからクエリする
    10.16.10 メソッド構文のクエリの接続
    11.16.11 クエリ結果のグループ化
    12.16.12 メソッド構文で複数のソースを関連付ける
    13.16.13 メソッド構文のグループ化結合
    14.16.14 メソッド構文の左外部結合
    15.16.15 メソッド構文のlet句/【Exercise】練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間