LoginSignup
1
0

More than 5 years have passed since last update.

ネストされたIEnumerableを展開する

Last updated at Posted at 2018-04-21

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);
}

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0