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

时间:2010-05-12 15:29:07

标签: linq .net-3.5 directory

以下作品,但我认为 - 因为它全部基于IEnumerableLinq可以派上用场。顺便说一句,是否有一个等价的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;
            }
        }
    }

3 个答案:

答案 0 :(得分: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
    );

.NET 4中的新功能:

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

答案 1 :(得分:2)

我没有信用,因为我让ReSharper为我做了,但这是它的建议。

private IEnumerable<string> getFiles(string strDirectory, bool bCompressedOnly) {
    foreach (var strFile in Directory.GetFiles(strDirectory).Where(strFile => !bCompressedOnly || Path.GetExtension(strFile).ToLower().Equals(".zip"))) {
        yield return strFile;
    }

    foreach (var strFile in Directory.GetDirectories(strDirectory).SelectMany(strDir => getFiles(strDir, bCompressedOnly))) {
        yield return strFile;
    }
}

它们都是随意的变化,并且在某些方面我认为(至少在第一个循环中)它们对逻辑进行了一些混淆,但是接受或者离开它。另外,如果您还没有,请查看ReSharper。 :)

答案 2 :(得分:2)

GetFiles有一个Directory重载方法,它采用搜索模式字符串和System.IO.SearchOption枚举。 SearchOption值之一是AllDirectories。如果使用它,你将摆脱你的方法的第二个循环。

private IEnumerable<string> getFiles(string strDirectory, bool bCompressedOnly)
{
    foreach (var strFile in Directory.GetFiles(strDirectory, bCompressedOnly ? "*.zip" : "*.*", SearchOption.AllDirectories))
    {
        yield return strFile;
    }
}