“我的工作是搜索文件并查看是否有任何文件有记录
超过一年。”
这指定您想要一个布尔结果,表明是否有任何文件具有这些记录。
为了好玩,我会再扩展一点:
我的工作是收集任何记录超过一年的文件。
你快到了。让我们首先用文件中的记录声明一个类:
public class MyRecord
{
public string Rec { get; set; }
public string CountryCode { get; set; }
public int Year { get; set; }
}
我将创建 FileInfo 类的扩展方法,该方法将读取文件并返回其中的 MyRecords 序列。
扩展方法见MSDN Extension Methods (C# Programming Guide)
public static class FileInfoExtension
{
public static IEnumerable<MyRecord> ReadMyRecords(this FileInfo file, char separator)
{
var records = new List<MyRecord>();
using (var reader = new StreamReader(file.FullName))
{
var lineToProcess = reader.ReadLine();
while (lineToProcess != null)
{
var splitLines = lineToProcess.Split(new char[] { separator }, 3);
if (splitLines.Length < 3) throw new InvalidDataException();
var record = new MyRecord()
{
Rec = splitLines[0],
CountryCode = splitLines[1],
Year = Int32.Parse(splitLines[2]),
};
records.Add(record);
lineToProcess = reader.ReadLine();
}
}
return records;
}
}
我本可以使用字符串而不是 FileInfo,但恕我直言,字符串与文件名完全不同。
在上面你可以写如下:
string startFolder = @"C:\MyFileFolder\";
var directoryInfo = new DirectoryInfo(startFolder);
var allFiles = directoryInfo.EnumerateFiles("*.*", SearchOption.AllDirectories);
var sequenceOfFileRecordCollections = allFiles.ReadMyRecords(',');
所以现在每个文件都有一个文件中的 MyRecords 序列。你想知道哪些文件有超过一年,让我们在 FileInfoExtension 类中添加另一个扩展方法:
public static bool IsMultiYear(this FileInfo file, char separator)
{
// read the file, only return true if there are any records,
// and if any record has a different year than the first record
var myRecords = file.ReadMyRecords(separator);
if (myRecords.Any())
{
int firstYear = myRecords.First().Year;
return myRecords.Any(record => record.Year != firstYear);
}
else
{
return false;
}
}
一年以上的文件顺序为:
allFiles.Where(file => file.IsMultiYear(',');
将所有内容放在一行中:
var allFilesWithMultiYear = new DirectoryInfo(@"C:\MyFileFolder\")
.EnumerateFiles("*.*", SearchOption.AllDirectories)
.Where(file => file.IsMultiYear(',');
通过创建两个相当简单的扩展方法,您的问题变成了一个高度可读的语句。