重构:计算给定文件夹下所有文件中的总行数

时间:2011-12-23 15:45:47

标签: c# .net-4.0 refactoring

我编写了一个代码来计算给定文件夹中所有文件的行数。它工作正常,但我试图包含所有可能的C#功能,以将其重构为更紧凑和高效的代码。请帮帮我。

这是代码。

    class LineNumberCounter
{
    public static string Calculate(string folderPath, string pattern = "*.txt")
    {
        DirectoryInfo dirInfo = new DirectoryInfo(folderPath.Trim());
        if (!dirInfo.Exists)
            throw new ArgumentException("No such directory exists");

        StringBuilder returnValue = new StringBuilder();
        long totalLines = 0;

        pattern.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).All(filter =>
        {
            int count = 0;
            dirInfo.GetFiles(filter.Trim(), 
                SearchOption.AllDirectories).All(file =>
                {
                    using (StreamReader reader = file.OpenText())
                    {
                        for (; reader.Peek() > -1; count++)
                            reader.ReadLine();
                    }
                    returnValue.AppendLine(string.Format("Number of lines with {0} pattern is {1}",
                        filter, count));
                    totalLines += count;

                    return true;
                }
            );

            return true;
        });

        //foreach (string filter in
        //    pattern.Split(new char[] { ';' },
        //        StringSplitOptions.RemoveEmptyEntries))
        //{
        //    FileInfo[] files = dirInfo.GetFiles(filter.Trim(),
        //        SearchOption.AllDirectories);
        //    int count = 0;
        //    Array.ForEach<FileInfo>(files, file =>
        //    {
        //        using (StreamReader reader = file.OpenText())
        //        {
        //            for (; reader.Peek() > -1; count++)
        //                reader.ReadLine();
        //        }
        //    });

        //    returnValue.AppendLine(string.Format("Number of lines with {0} pattern is {1}",
        //        filter, count));
        //    totalLines += count;
        //}

        returnValue.AppendLine();
        returnValue.AppendLine("Total Lines = " + totalLines);

        return returnValue.ToString();
    }
}

注释行是我最初写的。我试图重构它。但仍想检查是否有更多范围。

2 个答案:

答案 0 :(得分:10)

使用新的>=.NET 4方法File.ReadLines()

int total = File.GetFiles(folderPath, pattern)
                .Sum(x => File.ReadLines(x).Count());

来自MSDN的一些注意事项:

  

ReadLines和ReadAllLines方法的不同之处如下:使用时   ReadLines,您可以先开始枚举字符串集合   整个系列归还;当你使用ReadAllLines时,你必须   在您可以访问之前等待返回整个字符串数组   数组。因此,当您处理非常大的文件时,   ReadLines可以更高效

答案 1 :(得分:1)

foreach (var filePath in Directory.GetFiles(folderPath, pattern(//standard pattern), SearchOption.AllDirectories))
{
    var count=File.OpenText(filePath).ReadAllLines().Count();
    returnValue.AppendLine(string.Format("Number of lines with {0} pattern is {1}",
            Path.GetExtension(filePath), count));
}