連載:[完全版]究極のC#プログラミングChapter15 LINQとクエリ式川俣 晶2010/03/17 |
|
|
15.22 クエリのインスタンス化
アルファベットA〜Zの26文字のうち、偶数番目の文字だけからなる文字列を生成したい、といった用途にも、もちろんLINQは使用できる。
このような目的にかなう文字番号のシーケンスを生成するクエリ式は、次のように記述できる。とても簡単である。
|
ところが、この番号のシーケンスから文字列オブジェクトを作成しようとすると、簡単ではない問題に突き当たる。stringクラスのコンストラクタは、列挙を入力として受け入れるインターフェースを持っていないのである。
このギャップを解消するには、「クエリのインスタンス化」を行うとよい。つまり、クエリ式をchar型の配列に変換してしまうのである(次ページリスト15.28参照)。char型の配列なら、stringクラスのコンストラクタが受け入れてくれる。そのためには、クエリ式に対してToArray()メソッドを実行する。これでクエリ式とstringクラスのコンストラクタが直結した。
| |
リスト15.28 インスタンス化されるクエリ式 |
ここで注意する点は2つある。1つは、結果をchar型で得るため、「select (char)n」とselect句にキャストを入れている点である。Enumerable.Rangeメソッドはint型の値範囲を提供するだけなので、このキャストがないとクエリ結果をchar型配列に変換できない。
もう1つは、必要リソースの増加である。列挙は単に列挙するだけならメモリをそれほど食わないが、配列に変換すれば配列の分だけメモリを消費する。配列に変換しないで実行できるときは、変換せずに行うほうがよいだろう。
ちなみに、ToArrayメソッドと同様に、List<T>オブジェクトを生成するToListメソッドもある。
「[完全版]究極の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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|