Считать данные, порядок которых указан в первой строке файла

У меня есть файл вида:

Id;LastName;FirstName;BirthDate
1;Иванов;Иван;01.01.1990
2;Иванова;Мария;01.05.1998
3;Иванов;Петр;01.01.1980

Нужно считать данные, учитывая, что порядок их может меняться, например стать:

BirthDate;LastName;FirstName;Id
01.01.1990;Иванов;Иван;1
01.05.1998;Иванова;Мария;2
01.01.1980;Иванов;Петр;3

Что-то кроме как switch с множеством case ничего не приходит в голову, подскажите, пожалуйста. При чем дальше идет пустая строка и идут данные о их родстве. Возможно это важно, я думаю считывать просто while (str != string.Empty).

Вот пример полного файла на всякий случай:

Id;LastName;FirstName;BirthDate
1;Иванов;Иван;01.01.1990
2;Иванова;Мария;01.05.1998
3;Иванов;Петр;01.01.1980
4;Иванова;Ольга;01.01.1971
5;Петрова;Маргарита;01.01.1972
6;Иванов;Олег;02.03.1995

3<->4=spouse
3<->1=parent
4<->1=parent
5<->3=sibling
6<->4=sibling

Сам файл лежит в формате .txt, поэтому считываю просто: string[] readedFile = File.ReadAllLines(DataWriter.PathOfFile);

Хочу считать в List<Human>.
Сам класс:

public class Human
    {
        public int Id { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public DateTime BirthDate { get; private set; }
    }

Вообще, мне нужно считать данные и сохранить в объекты, затем обращаясь например у людей с Id 1 и 2 должен вернуться тип "sibling", хотя этого не было указано в файле явно. Но я не понимаю пока как правильно здесь реализовать объектную модель.


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

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

Предлагаю следующий подход:

  1. Создать enum на основе строковых значений
  2. Создать класс с всеми необходимыми полями
  3. Спарсить первую строку, чтобы понять последовательность значений относительно типа столбца (enum)
  4. Спарсить все остальные на основе конструкции switch case , ориентируясь на последовательность значений из п.3

в рамках псевдокода:

var tmp = someClass();

switch firstRowEnums[i] {
 case .id: 
    tmp.id = cell[i][j];
 case .firstName:
    tmp.firstName = cell[i][j];
 case .lastName:
    tmp.lastName = cell[i][j];
 case .birth:
    tmp.birth = cell[i][j];
}

dataList.add(tmp);

Еще может быть полезным https://ru.stackoverflow.com/a/560134/186752

→ Ссылка