Ошибки при проверке на тип данных в методе c#

У меня есть метод, который считывает данные с файла в двумерный массив object, исходных данные:

1950;событие 1 бла-бла-бла   
1991-06-01;какое-то событие 3  
2000-01-01;наступил миллениум, ура-ура-ура

Мне нужно, чтобы они считались и записались в него, проблема заключается в том, что первая строчка имеет первое значение типа int, а все остальные DateTime, я вроде бы написал проверку на тип данных, но она не работает, сам весь код корректный если убрать только первую строчку, в ней вся проблема.
Ошибка которую выдает компилятор: "System.FormatException: String '1950' was not recognized as a valid DateTime." Сам метод:

static object[][] ReadDataObjectForTimeline(string filePath)
        {
            var readedFile = File.ReadAllLines(filePath);
            object[][] splitData = new object[readedFile.Length][];

            for (var i = 0; i < readedFile.Length; i++)
            {
                var line = readedFile[i];
                string[] parts = line.Split(";");

                object[] values = new object[parts.Length];
                if (values[0] is int)
                    values[0] = int.Parse(parts[0]);
                else
                    values[0] = DateTime.Parse(parts[0]);
                values[1] = parts[1];

                splitData[i] = values;
            }
            return splitData;
        }

Ответы (1 шт):

Автор решения: aepot

values[0] is int вернет всегда false, потому что values[0] у вас null, вы туда еще ничего не записали. Быть может вы хотели parts[0] is int написать, но и это бы тоже не сработало, потому что parts[0] - это string.

Этот процесс называется десереализация.

Самый простой способ разобрать, это создать класс для данных, а не мучаться с вложенными массивами.

public class Item
{
    public DateTime Date { get; set; }
    public string Text { get; set; }
}

И далее десереализовать в массив таких объектов

public Item[] ParseFile(string path)
{
    string[] lines = File.ReadAllLines(path);
    Item[] result = new Item[lines.Length];
    for (int i = 0; i < lines.Length; i++)
    {
        string[] tokens = lines[i].Split(';');
        result[i] = new Item
        {
            Date = DateTime.TryParse(tokens[0], out DateTime date) ? date : DateTime.ParseExact(tokens[0], "yyyy", CultureInfo.InvariantCulture),
            Text = tokens[1]
        };
    }
    return result;
}

То есть то число как я понял, не int, а год от даты, поэтому его тоже можно сохранить в DateTime.

А чтобы не мучаться с ручным разбором CSV, есть готовый NuGet пакет CSVHelper.


Вариант с вложенным массивом и интом.

public object[][] ParseFile(string path)
{
    string[] lines = File.ReadAllLines(path);
    object[][] result = new object[lines.Length][];
    for (int i = 0; i < lines.Length; i++)
    {
        string[] tokens = lines[i].Split(';');
        result[i] = new object[]
        {
            DateTime.TryParse(tokens[0], out DateTime date) ? date : int.Parse(tokens[0]),
            tokens[1]
        };
    }
    return result;
}
→ Ссылка