在Where子句中使用Substring的Directory.GetFiles上的LINQ

时间:2018-03-13 08:42:49

标签: c# linq substring

我有一个目录,其中有两个* .xml文件以" L"开头。我尝试了各种LINQ语法,但都没有返回任何文件。它应该很简单,但我无法解决这个问题。

IEnumerable<string> files = Directory.EnumerateFiles(path)
    .Where(p => p.Substring(0,1) == "L");

IEnumerable<string> files = Directory.GetFiles(path, "*.xml")
    .Where(p => (p.Substring(0,1) == "L"))

IEnumerable<string> files = Directory.EnumerateFiles(path)
    .Where(p => p.StartsWith("L"))

3 个答案:

答案 0 :(得分:7)

EnumerateFilesGetFiles返回完整路径,而不仅仅是文件名。

您可以使用IO.Path课程和GetFileNameGetFileNameWithoutExtension

IEnumerable<string> files = Directory.EnumerateFiles(path)
    .Where(p => Path.GetFileNameWithoutExtension(p).StartsWith("L"));

如果您想忽略此案例,请同时接受l,请使用StartsWith的重载:

IEnumerable<string> files = Directory.EnumerateFiles(path)
    .Where(p => Path.GetFileName(p).StartsWith("L", StringComparison.InvariantCultureIgnoreCase));

如评论所述,在这种情况下,最简单的方法是使用EnumerateFilessearchPattern

IEnumerable<string> files = Directory.EnumerateFiles(path, "L*.xml");

答案 1 :(得分:5)

让我们看看这两个:

IEnumerable<string> files = 
        Directory.GetFiles(path, "*.xml")
        .Where(p => (p.Substring(0,1) == "L"));
IEnumerable<string> files = 
        Directory.EnumerateFiles(path)
        .Where(p => p.StartsWith("L"));

你必须明白路径是“c:\ blah \ blah \ blah \ L001.xml”。

您需要先获取文件名。这可以通过使用Path.GetFilename(...)

来实现
IEnumerable<string> files = 
        Directory.GetFiles(path, "*.xml")
        .Where(p => (Path.GetFilename(p).Substring(0,1) == "L"));
IEnumerable<string> files = 
        Directory.EnumerateFiles(path)
        .Where(p => Path.GetFilename(p).StartsWith("L"));

编辑评论中的克莱门斯建议可能是最简单的方法。

答案 2 :(得分:3)

这应该是最快的方式,而不是获取所有文件并在之后过滤

IEnumerable<string> files = Directory.EnumerateFiles(path, "L*.xml")