gpt4 book ai didi

c# - LINQ where 子句与 Func<> 和 Foreach 组合

转载 作者:行者123 更新时间:2023-12-03 07:08:32 27 4
gpt4 key购买 nike

我想做什么:

我有一个扩展名列表(.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 相结合?或者我应该寻找另一种方法来做到这一点?

最佳答案

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

关于c# - LINQ where 子句与 Func<> 和 Foreach 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13894800/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com