CsvHelper.GetRecords in returnin处置

问题描述 投票:0回答:1

我想从工作代码中提取方法。在此功能内,我可以访问记录。但是返回时,记录的内容将被处置。所以我尝试将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;
        }
    }
csvhelper
1个回答
0
投票

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

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

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

CsvHelper Getting Started

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

© www.soinside.com 2019 - 2024. All rights reserved.