2

私は何をしようとしています:

拡張子のリスト(.mpg、.avi、.jpg)...とファイル名のリスト(stuff.jpg、dogs.txt、movie.avi)があります。

ファイル名のリストと拡張子のリストを比較し、拡張子が一致するファイルのみを保持したいと思います。上記の例の場合、stuff.jpgとmovie.aviの場合、dogs.txtは無視する必要があります。

私はそれをどのようにやっていますか:

文字列のリスト(.mp3、mp4、.avi ...などのファイル拡張子)があります:

        List<String>  extensions = new List<string>();
        extensions.Add(".mp4");
        extensions.Add(".mp3");
        extensions.Add(".avi");
        extensions.Add(".mkv");
        extensions.Add(".mpeg");
        extensions.Add(".mpg");

また、いくつかのファイルを含むIEnumerableがあります。

私がやりたいのは、IEnumerable内のすべてのファイルをチェックして、上記のリストにある拡張子の1つ(つまり、.mpg、.mp3 ...)と一致する拡張子があるかどうかを確認することです。

今私はこれをやっています:

    var files = dir.EnumerateFiles();
    var newlist = files.Where(doesItMatch).Select(x => x).ToList();

    private Func<FileInfo, bool> doesItMatch = x =>
            {
                return x.Extension == ".mp3";
            };

これは機能しますが、明らかに「.mp3」と一致するかどうかのみをチェックします。事は私が次のようなことを始めたくないということです

where x == ".mp4" || x == ".avi" || x == ".mpg" ....

基本的に、拡張子のリスト内のすべての要素を反復処理し、それをIEnumerable内のファイルの現在の拡張子と一致させたいと思います。

私はこのようなforeachを実行しようとしました:

 var newlist = files.Where(file => extensions.ForEach(ext => file.Extension == ext) ).Select(x => x).ToList();

しかし、これは私にエラーを与え、 file.Extension == ext「割り当て、呼び出し...はステートメントとして使用できる」と述べています。

だから私の質問は、Func<>拡張機能のリストにある種のforeachと組み合わせて上記の説明を使用できますか?または、これを行う別の方法を探す必要がありますか?

4

2 に答える 2

4
var files = Directory.EnumerateFiles(path)
                     .Where(f => extensions.Contains(new FileInfo(f).Extension))
                     .ToList();

そしてあなたのdoesItMatch

var extensions = new HashSet<string>(new[] { ".mp4", ".mp3", ".avi",".mkv",".mpeg",".mpg" });

Func<string, bool> doesItMatch = x => extensions.Contains(new FileInfo(x).Extension);

var files = Directory.EnumerateFiles(path)
                     .Where(f => doesItMatch(f))
                     .ToList();
于 2012-12-15T18:13:58.960 に答える
2

検索するfunc<>を作成する必要がない別の方法は、ANYlinqメソッドを使用することです。

List<string> extenstions = new List<string>
{
   ".txt",
   ".pdf"
};

DirectoryInfo dir = new DirectoryInfo(@"C:\Users\Administrator\Desktop");

IEnumerable<FileInfo> foundFiles = dir.EnumerateFiles().Where(f => ext.Any(e => f.Extension == e));
于 2012-12-15T18:39:35.823 に答える