Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重构:计算给定文件夹下所有文件的总行数_C#_.net 4.0_Refactoring - Fatal编程技术网

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

C# 重构:计算给定文件夹下所有文件的总行数,c#,.net-4.0,refactoring,C#,.net 4.0,Refactoring,我编写了一个代码来计算给定文件夹中所有文件的行数。它工作得很好,但我正在尝试包含所有可能的C#特性,以便将其重构为更紧凑、更高效的代码。请帮我做那件事 这是代码 class LineNumberCounter { public static string Calculate(string folderPath, string pattern = "*.txt") { DirectoryInfo dirInfo = new DirectoryInfo(fol

我编写了一个代码来计算给定文件夹中所有文件的行数。它工作得很好,但我正在尝试包含所有可能的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();
    }
}
类行号计数器
{
公共静态字符串计算(字符串文件夹路径,字符串模式=“*.txt”)
{
DirectoryInfo dirInfo=newdirectoryinfo(folderPath.Trim());
如果(!dirInfo.Exists)
抛出新ArgumentException(“不存在这样的目录”);
StringBuilder returnValue=新建StringBuilder();
长线=0;
pattern.Split(新字符[]{';'},StringSplitOptions.RemoveEmptyEntries).All(过滤器=>
{
整数计数=0;
dirInfo.GetFiles(filter.Trim(),
SearchOption.AllDirectories).All(文件=>
{
使用(StreamReader=file.OpenText())
{
对于(;reader.Peek()>-1;count++)
reader.ReadLine();
}
AppendLine(string.Format)({0}模式的行数为{1}),
过滤、计数);
总数+=计数;
返回true;
}
);
返回true;
});
//foreach(中的字符串筛选器)
//pattern.Split(新字符[]{';'},
//StringSplitOptions.RemoveEmptyEntries)
//{
//FileInfo[]files=dirInfo.GetFiles(filter.Trim(),
//SearchOption.AllDirectories);
//整数计数=0;
//Array.ForEach(文件,文件=>
//    {
//使用(StreamReader=file.OpenText())
//        {
//对于(;reader.Peek()>-1;count++)
//reader.ReadLine();
//        }
//    });
//AppendLine(string.Format)({0}模式的行数为{1}),
//过滤、计数);
//总数+=计数;
//}
returnValue.AppendLine();
returnValue.AppendLine(“合计行=+合计行”);
返回returnValue.ToString();
}
}

注释行是我最初写的。我做了一些重构的尝试。但是仍然要检查它是否有更多的作用域。

使用新的
=.NET4
方法

以下方面的一些考虑:

ReadLines和ReadAllLines方法的区别如下: 在ReadLines中,可以开始枚举字符串集合 全部藏品归还;使用ReadAllLines时,必须 等待返回整个字符串数组,然后才能访问 阵列。因此,在处理非常大的文件时, 读线可以更高效


folderPath不是最好的方法,我会加载sln文件,因为它是基于文本的,并且包含了所有包含路径的文件。代码的用户不是.Net。它可以是包含任何类型文件的任何通用Windows文件夹。过滤器/模式将确定我正在处理基于文本的文件。Sln文件可以在磁盘上的其他位置进行物理解析*。我相信Sln可以在任何操作系统中完成。您为什么要在sln之外计算smth?是吗o。哇!有那么短吗?伟大的让我检查一下。File.ReadAllLines是否将所有文本存储在字符串中?因为我对存储在我内存中的大文件有着不好的体验(我使用的是ruby),而编写(数一数,然后忘记)/readline(数一数,然后忘记)却没有这种体验problem@Fire-Dragon DoL:是的,但由于没有具体的性能优化要求,该解决方案将非常有效,每次你写简短整洁的代码时,你都需要支付一些费用,LINQ也是一样,这不是免费的,最好的性能感知解决方案需要更多的技术知识,因此手动创建流和计算换行符可能会更好。我认为您应该使用
File.ReadLines
而不是
File.ReadAllLines
<代码>文件。ReadAllLines将在您可以计数之前将所有行存储在字符串数组中,因此这是一种内存浪费
File.ReadLines(x).Count()
将在读取时对行进行计数,而不存储它们。
File.ReadAllLines(x)
还将返回一个空行,这些空行不是代码行。这将计算文件中的行数,但不计算代码行数。我错过什么了吗?
int total = File.GetFiles(folderPath, pattern)
                .Sum(x => File.ReadLines(x).Count());
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));
}