【问题标题】:LINQ on Directory.GetFiles with Substring in Where clauseLINQ on Directory.GetFiles with Substring in Where 子句
【发布时间】:2018-08-21 10:37:28
【问题描述】:

我有一个目录,其中包含两个以“L”开头的 *.xml 文件。我尝试了各种 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"))

【问题讨论】:

  • 下次用调试器就好了。然后您将看到这些文件具有绝对路径,而不是相对于该目录。

标签: c# linq substring


【解决方案1】:

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

正如评论,在这种情况下,最简单的方法是使用searchPatternEnumerateFiles

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

【讨论】:

    【解决方案2】:

    让我们看看这两个:

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

    编辑 Clemens 在评论中的建议可能是最简单的方法。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-13
        • 1970-01-01
        相关资源
        最近更新 更多