我想从工作代码中提取方法。在此功能内,我可以访问记录。但是返回时,记录的内容将被处置。所以我尝试将csv.GetRecords()转换为列表,但出现错误消息,因为记录仅包含方法Equals(),GetEnumerator(),GetHasCode(),GetType()和ToString()。我快疯了:/有人可以帮助我吗?谢谢。
private static IEnumerable<Animal> LoadFromCsvFile(/*[ExistingFile]*/ string fileName, Encoding encodingFormat, char separator)
{
using (var reader = new StreamReader(fileName))
using (var csv = new CsvReader(reader))
{
csv.Configuration.RegisterClassMap<AnimalClassMap>();
csv.Configuration.Delimiter = separator.ToString(CultureInfo.InvariantCulture);
csv.Configuration.Encoding = encodingFormat;
IEnumerable<Animal> records = csv.GetRecords<Animal>();
foreach (Animal rec in records)
{
Console.WriteLine($"{rec.FatherId}x{rec.MotherId} - {rec.Name} ({rec.Male}) breed {rec.Breed}");
}
return records;
}
}
GetRecords<Animal>()
不会立即获取记录。遍历记录时会产生结果。当您在迭代它们之前返回records
时,您会发现CsvReader
上下文已被处理,并且不再可以yield
结果。您可以通过在.ToList()
离开using语句之前枚举所有记录来解决此问题。
IEnumerable<SccAnimal> records = csv.GetRecords<Animal>().ToList();
另一种选择是制作LoadFromCsvFile : IDisposable
,然后以StreamReader
方法处理CsvReader
和Dispose()
,而不是将它们放在using
语句中。在这种情况下,您将不会可以对其进行迭代[两次。
GetRecords方法将返回一个IEnumerable,它将产生记录。这意味着您在迭代记录时一次仅返回一条记录。这也意味着只有一小部分文件被读入内存。