Ошибки при проверке на тип данных в методе 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 шт):
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;
}