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

Chapter15 LINQとクエリ式

川俣 晶
2010/03/17
Page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

15.22 クエリのインスタンス化

 アルファベットA〜Zの26文字のうち、偶数番目の文字だけからなる文字列を生成したい、といった用途にも、もちろんLINQは使用できる。

 このような目的にかなう文字番号のシーケンスを生成するクエリ式は、次のように記述できる。とても簡単である。

from n in Enumerable.Range('A', 26)
where (n % 2) == 0
select n

 ところが、この番号のシーケンスから文字列オブジェクトを作成しようとすると、簡単ではない問題に突き当たる。stringクラスのコンストラクタは、列挙を入力として受け入れるインターフェースを持っていないのである。

 このギャップを解消するには、「クエリのインスタンス化」を行うとよい。つまり、クエリ式をchar型の配列に変換してしまうのである(次ページリスト15.28参照)。char型の配列なら、stringクラスのコンストラクタが受け入れてくれる。そのためには、クエリ式に対してToArray()メソッドを実行する。これでクエリ式とstringクラスのコンストラクタが直結した。

using System;
using System.Linq;

class Program
{
  static void Main(string[] args)
  {
    string s = new string((from n in Enumerable.Range('A', 26)
                           where (n % 2) == 0
                           select (char)n).ToArray());

    Console.WriteLine(s); // 出力:BDFHJLNPRTVXZ
  }
}
リスト15.28 インスタンス化されるクエリ式

 ここで注意する点は2つある。1つは、結果をchar型で得るため、「select (char)n」とselect句にキャストを入れている点である。Enumerable.Rangeメソッドはint型の値範囲を提供するだけなので、このキャストがないとクエリ結果をchar型配列に変換できない。

 もう1つは、必要リソースの増加である。列挙は単に列挙するだけならメモリをそれほど食わないが、配列に変換すれば配列の分だけメモリを消費する。配列に変換しないで実行できるときは、変換せずに行うほうがよいだろう。

 ちなみに、ToArrayメソッドと同様に、List<T>オブジェクトを生成するToListメソッドもある。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter15 LINQとクエリ式
    1.15.1 LINQの面白さ
    2.15.2 LINQとは何か?
    3.15.3 「値の集まり」に対する演算
    4.15.4 なぜLINQなのか?
    5.15.5 最も基本的なLINQ
    6.15.6 LINQの本質は列挙
    7.15.7 LINQを使ううえでの注意点
    8.15.8 クエリ結果を加工する
    9.15.9 複数のソースからクエリする
    10.15.10 条件で絞り込む
    11.15.11 一部項目のみselectする
    12.15.12 シンプルなソート
    13.15.13 クエリの接続
    14.15.14 クエリ結果のグループ化
    15.15.15 複数ソースを関連付けるjoin句
    16.15.16 from句とjoin句のパフォーマンス
    17.15.17 join句のグループ化結合
    18.15.18 join句の左外部結合
    19.15.19 単独で使うDefaultIfEmptyメソッド
    20.15.20 内部列挙を伴うfrom句の二重使用
    21.15.21 let句
  22.15.22 クエリのインスタンス化
    23.15.23 クエリ結果の個数を得る
    24.15.24 Anyメソッドと存在チェック/【C#olumn】クエリ式のデバッグテクニック
    25.15.25 まとめ/【C#olumn】LINQの難しさ/【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 記事ランキング

本日 月間