C# 重构:计算给定文件夹下所有文件的总行数
我编写了一个代码来计算给定文件夹中所有文件的行数。它工作得很好,但我正在尝试包含所有可能的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
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));
}