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 中的每个文件,看看它的扩展名是否与我上面列表中的扩展名之一匹配(所以 .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<> 进行搜索的另一种方法是仅使用 ANY linq 方法:

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 回答