有没有办法在Linq的帮助下使这个C#方法更短,更易读?

Ham*_*jan 1 linq directory .net-3.5

以下作品,但我想 - 因为它全部基于IEnumerable,Linq这里可以派上用场.顺便说一句,是否有一个等效的Directory.GetFiles()将返回IEnumerable而不是数组?如果它存在,那么它会使代码运行得更快吗?问题的最后一部分受到Python语言的启发,它支持轻量级生成器而不是具体列表.

    private IEnumerable<string> getFiles(string strDirectory, bool bCompressedOnly)
    {
        foreach (var strFile in Directory.GetFiles(strDirectory))
        {
            // Don't add any existing Zip files since we don't want to delete previously compressed files.
            if (!bCompressedOnly || Path.GetExtension(strFile).ToLower().Equals(".zip"))
            {
                yield return strFile;
            }
        }

        foreach (var strDir in Directory.GetDirectories(strDirectory))
        {
            foreach (var strFile in getFiles(strDir, bCompressedOnly))
            {
                yield return strFile;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Dan*_*haw 7

我不认为我更喜欢这个,但......

return (
        from file in Directory.GetFiles(strDirectory)
        where !bCompressedOnly
            || Path.GetExtension(file).ToLower().Equals(".zip")
        select file
    ).Concat(
        from directory in Directory.GetDirectories(strDirectory)
        from file in getFiles(directory, bCompressedOnly)
        select file
    );
Run Code Online (Sandbox Code Playgroud)

.NET 4中的新功能:

private static IEnumerable<string> getFiles(string strDirectory,
    bool bCompressedOnly)
{
    return Directory.EnumerateFiles(strDirectory,
        bCompressedOnly ? "*.zip" : "*.*", SearchOption.AllDirectories);
}
Run Code Online (Sandbox Code Playgroud)