0

对于这是否是检索我需要的东西的最佳方法,我有点困惑。我有一个使用 ftp 从目录中获取的文件列表。我需要根据用户输入的文件掩码过滤文件名列表List<string>。我喜欢 LINQ,但几个月没有使用它,我似乎已经失去了一些技能。到目前为止,我已经想出了以下内容。如果有人可以验证我所做的是最好的方法,我会很感激。

foreach (string s in fileMasks)
{
    fileNames.AddRange(
        directory.Files.ToList().Where(a => a.Name.EndsWith(s))
        .Select(b => b.Name)
    );
}
4

4 回答 4

2

你可以简化你的查询

fileNames.AddRange(directory.Files.Select(f => f.Name).Where(a => a.EndsWith(s));
于 2012-08-03T08:25:25.153 回答
2

看起来不错,但你可以跳过.ToList()中间的。

您还可以使用查询语法重写

fileNames.AddRange(
    from file in directory.Files
    where file.Name.EndsWith
    select file.Name
);

我经常发现查询语法更容易阅读。

于 2012-08-03T08:25:53.203 回答
1

你不需要任何foreach循环AddRange,你可以使用SelectMany扩展方法:

List<string> result = directory
    .Files
    .SelectMany(f => fileMasks.Where(m => f.Name.EndsWith(m)), (f, m) => f.Name)
    .ToList();

或者,如果您更喜欢使用 LINQ 语法:

List<string> result =
    (from f in directory.GetFiles()
    from m in fileMasks
    where f.Name.EndsWith(m)
    select f.Name).ToList();

那是LINQ。但是由于您正在处理过滤目录,因此您可以使用文件掩码。该DirectoryInfo.GetFiles方法允许您执行此操作。

于 2012-08-03T08:30:10.800 回答
0

没有 foreach 语句的解决方案

fileNames.AddRange(
    (from file in directory.Files
    from m in fileMasks
    where file.Name.EndsWith(m)
    select file.Name)); 
于 2012-08-03T08:32:57.000 回答