|
 |
連載:[完全版]究極のC#プログラミング
Chapter15 LINQとクエリ式
川俣 晶
2010/03/17 |
|
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の実行結果例 |
まだここではこのクエリを理解することはできないだろうが、それでいい。込み入った処理がたった数行のクエリ式で実現できたことだけ把握してほしい。ここから始まるのは、それを自分で行うための解説である。
Insider.NET 記事ランキング
本日
月間