【问题标题】:CsvHelper.GetRecords disposed when returnin返回时处理 CsvHelper.GetRecords
【发布时间】:2020-01-10 20:36:37
【问题描述】:

我想从工作代码中提取一个方法。在这个函数中,我可以访问记录。但是在返回时,记录的内容会被处理掉。 所以我尝试将 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


    【解决方案1】:

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

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

    另一种选择是创建LoadFromCsvFile : IDisposable,然后在Dispose() 方法中处理StreamReaderCsvReader,而不是将它们放在using 语句中。在这种情况下,您将无法将它们迭代两次

    CsvHelper Getting Started

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

    【讨论】:

    • IEnumerable records2 = csv.GetRecords().ToList();不编译: Erreur CS1061 'IEnumerable' ne contient pas de definition pour 'ToList' et aucune method d'extension Accessible 'ToList' acceptant un Premier argument de type 'IEnumerable' n'a été trouvée (une使用 ou une référence d'assembly est-elle manquante 的指令?)
    • 您需要为 System.Linq 添加 using 指令。 using System.Linq;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2011-01-01
    • 2015-07-06
    • 2011-05-08
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多