CsvHelper.GetRecords утилизируется при возврате в - PullRequest
0 голосов
/ 10 января 2020

Я хочу извлечь метод из рабочего кода. Внутри этой функции я могу получить доступ к записям. Но при возврате содержимое записей удаляется. Поэтому я пытаюсь преобразовать 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;
        }
    }

1 Ответ

0 голосов
/ 11 января 2020

GetRecords<Animal>() не получает записи сразу. Это дает результаты, когда вы перебираете записи. Когда вы возвращаете records перед их повторением, вы обнаруживаете, что этот контекст CsvReader уже удален и больше не может yield результаты. Это можно исправить, перечислив все записи с помощью .ToList() до того, как он покинет оператор using.

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

Другой вариант - сделать LoadFromCsvFile : IDisposable, а затем удалить StreamReader и CsvReader в методе Dispose() вместо помещения их в оператор using. В этом случае вы не сможете итерировать их дважды .

CsvHelper Начало работы

Метод GetRecords вернет IEnumerable, который выдаст записи. Это означает, что во время итерации записей одновременно возвращается только одна запись. Это также означает, что только небольшая часть файла считывается в память.

...