使用linq过滤列表的最佳方法?

时间:2012-08-03 08:21:52

标签: c# linq

我对这是否是检索我需要的最佳方法感到有点困惑。我已经从使用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 个答案:

答案 0 :(得分:2)

你可以简化你的查询

fileNames.AddRange(directory.Files.Select(f => f.Name).Where(a => a.EndsWith(s));

答案 1 :(得分:2)

似乎没问题,但你可以跳过中间的.ToList()

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

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

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

答案 2 :(得分: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方法允许您执行此操作。

答案 3 :(得分:0)

没有foreach声明的解决方案

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