我编写了一个代码来计算给定文件夹中所有文件的行数。它工作正常,但我试图包含所有可能的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();
}
}
注释行是我最初写的。我试图重构它。但仍想检查是否有更多范围。
答案 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));
}