連載:[完全版]究極の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


 本記事は、(株)技術評論社が発行する書籍『[完全版]究極のC#プログラミング ― 新スタイルによる実践的コーディング』から、許可を得て転載しています。
 同書籍は、もともと本フォーラムにて連載していた『C# 2.0入門』、『C# 3.0入門』の記事を整理統合し、加筆、修正されたものです。

  手元でまとめて読みたい方は、ぜひ書店などにてお買い求めください。

 【注意】本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

15.1 LINQの面白さ

 LINQ(リンク)の話を始める前に、まずコード例を1つ紹介しよう。筆者がLINQについて調べているときに、特に面白いと思ったMSDNのサンプルだ。

方法:ディレクトリツリーで重複するファイルを問い合わせる(LINQ)
http://msdn.microsoft.com/ja-jp/library/bb546133.aspx

 ディレクトリのツリーの中では、異なるディレクトリに同じファイル名を持つファイルが存在することがある。それをすべてリストアップするサンプルである。上記のページのサンプルコードは多機能すぎてLINQビギナーが見てもコードの迷宮に飲まれてしまう可能性があるので、エッセンスだけ残して周辺を落としたものを作成した(リスト15.1参照)。

 さて、ここで「重複するファイルを問い合わせる」というクエリは「var queryDup Names = ……」の行から全6行の1つのクエリ式だけで実現されている。同じ機能のコードを、LINQ抜きでは何行で書けるか考えてみていただきたい。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

class QueryDuplicateFileNames改
{
  static void Main(string[] args)
  {
    // 検索開始ディレクトリ
    string startFolder =
        @"d:\program files\Microsoft Visual Studio 9.0\";

    int charsToSkip = startFolder.Length;

    // ファイルを列挙し、それらのFileInfoオブジェクトを取得
    IEnumerable<FileInfo> fileList =
        Directory.GetFiles(startFolder, "*.*",
        SearchOption.AllDirectories).Select(x => new FileInfo(x));

    // LINQのクエリ
    var queryDupNames =
      from file in fileList
      group file.FullName.Substring(charsToSkip)
                              by file.Name into fileGroup
      where fileGroup.Count() > 1
      select fileGroup;

    foreach (var filegroup in queryDupNames)
    {
      foreach (var fileName in filegroup)
      {
        Console.WriteLine(fileName);
      }
      Console.WriteLine();
    }
  }
}
リスト15.1 重複するファイルを見つける

readme.htm
Microsoft Visual Studio 2008 Professional Edition - JPN\readme.htm

Xml\SnippetsIndex.xml
VC#\Snippets\1041\SnippetsIndex.xml

Xml\1041\Snippets\xsd\SimpleTypes\enum.snippet
Xml\1041\Snippets\xsd\Attributes\enum.snippet
VC#\Snippets\1041\Visual C#\enum.snippet

Xml\1041\Snippets\xsd\SimpleTypes\integer.snippet
Xml\1041\Snippets\xsd\Attributes\integer.snippet

 …
リスト15.1の実行結果例

 まだここではこのクエリを理解することはできないだろうが、それでいい。込み入った処理がたった数行のクエリ式で実現できたことだけ把握してほしい。ここから始まるのは、それを自分で行うための解説である。


 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 記事ランキング

本日 月間