IEnumerable<IEnumerable<T>>をIEnumerable<T>にしたい
DirectoryInfoをもとにFileInfoを取得するとネストされたFileInfoのIEnumerableを取得してしまいます。
その場合、どのように展開するかについてです。
コード
using System;
using System.IO;
using System.Linq;
public static void Main(string[] args)
{
//ディレクトリ名が入ったテキストファイルからディレクトリ情報を取得し、IEnumerable<DirectoryInfo>を生成
var lines = File.ReadLines("FileName");
var directories = lines.Select(line=>new DirectoryInfo(line));
//上で作成したディレクトリ情報集をもとに、ネストされたファイル情報集を生成する
//このときnestedFilesの型はIEnumerable<IEnumerable<FileInfo>>である
var nestedFiles = directories.Select(directory=>directory.EnumerateFiles());
}
展開方法
種明かしでもなんでもありませんが、単純にyield returnを使うだけです。
下記メソッドで解決します。
static IEnumerable<FileInfo> Flattening(IEnumerable<IEnumerable<FileInfo>> source)
{
foreach(var files in source)
{
foreach(var file in files)
{
yield return file;
}
}
}
追記
コメントからSelectMany使えばいいんじゃない? という旨をいただきましたが……可能でした。
ネストされている要素を取り出す感じで使えるみたいですね。Main部分に適用するなら次のように使う感じかな
MSDN - Enumerable.SelectManyメソッド
using System;
using System.IO;
using System.Linq;
public static void Main(string[] args)
{
//ディレクトリ名が入ったテキストファイルからディレクトリ情報を取得し、IEnumerable<DirectoryInfo>を生成
var lines = File.ReadLines("FileName");
var directories = lines.Select(line=>new DirectoryInfo(line));
//上で作成したディレクトリ情報集をもとに、ネストされたファイル情報集を生成する
//このときnestedFilesの型はIEnumerable<IEnumerable<FileInfo>>である
var nestedFiles = directories
.Select(directory=>directory.EnumerateFiles());
//ネストされたファイル情報集を平坦化する。
var flatternFiles = nestedFiles.SelectMany(file=>file);
}