RSS

Advent LINQ (2): TextReader.AsEnumerable

01 12月

TextReaderで読み取れる行を、列挙子に変えてみる。

public static class LinqExtensions
{
	public static IEnumerable<string> AsEnumerable(this TextReader tr)
	{
		try
		{
			while (true)
			{
				var line = tr.ReadLine();
				if (line == null)
				{
					break;
				}

				yield return line;
			}
		}
	 	finally
		{
			tr.Dispose();
		}
	}
}

TextReaderは全て読み取った時点でDisposeを呼び出している。こうする事で、

foreach (var line in File.OpenText("VeryLongTextFile.txt").AsEnumerable())
{
	Console.WriteLine(line);
}

という使い方をしても、列挙が終わればリーダーがクローズされるようになる。
一旦列挙子になってしまえば、

// フォルダ内のすべてのテキストファイルの、先頭・終端の空白を削除し、
// 空行や#で始まる行を除外して、ソートして表示
foreach (var line in
	from path in
		Directory.GetFiles(".", "*.txt", SearchOption.AllDirectories).
		AsParallel()
	from line in
		File.OpenText(path).
		AsEnumerable()
	let trim = line.Trim()
	where (trim.Length >= 1) && (trim.StartsWith("#") == false)
	orderby trim
	select trim)
{
	Console.WriteLine(line);
}

こんなことも自在に行える。

広告
 
コメントする

投稿者: : 2013/12/01 投稿先 .NET, LINQ

 

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。