首页 > 解决方案 > 返回时处理 CsvHelper.GetRecords

问题描述

我想从工作代码中提取一个方法。在这个函数中,我可以访问记录。但是在返回时,记录的内容会被处理掉。因此,我尝试将 csv.GetRecords() 转换为 List,但出现错误消息,因为记录仅包含方法 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;
        }
    }

标签: csvhelper

解决方案


GetRecords<Animal>()没有立即获得记录。它会在您迭代记录时产生结果。当您records在迭代它们之前返回时,您会发现该CsvReader上下文已经被释放并且不再yield是结果。.ToList()您可以通过在它离开 using 语句之前枚举所有记录来解决此问题。

IEnumerable<SccAnimal> records = csv.GetRecords<Animal>().ToList();

另一种选择是在方法中制作LoadFromCsvFile : IDisposable然后处置StreamReader和,而不是将它们放在语句中。在这种情况下,您将无法对其进行两次迭代。CsvReaderDispose()using

CsvHelper 入门

GetRecords 方法将返回将产生记录的 IEnumerable。这意味着在您迭代记录时一次只返回一条记录。这也意味着只有一小部分文件被读入内存。


推荐阅读