Есть ли способ сделать этот метод C # короче и более читабельным с помощью Linq? - PullRequest
1 голос
/ 12 мая 2010

Следующее работает, но я понял - так как все это основано на 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;
            }
        }
    }

Ответы [ 3 ]

7 голосов
/ 12 мая 2010

Не думаю, что предпочитаю это, но ...

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);
}
2 голосов
/ 12 мая 2010

Существует метод перегрузки 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;
    }
}
2 голосов
/ 12 мая 2010

Я беру нулевой кредит, потому что я сделал так, чтобы 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 , если вы еще этого не сделали. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...