@juliion

Конвертировать строку в объект?

Есть строка, которая содержит информацию про транзакцию.
(Пример "John, Doe, “Lviv, Kleparivska 35, 4”, 500.0, 2022-27-01, 1234567, Water").
Нужно конвертировать эту строку в объект Transaction.

Код класса Transaction:
public class Transaction
    {
        public string Name { get; set; }
        public string City { get; set; }
        public decimal Payment { get; set; }
        public DateTime Date { get; set; }
        public long AccountNumber { get; set; }
        public string Service { get; set; }
    }


Вот мое решение:
public enum FieldsIndices
    {
        nameInd = 0,
        surnameInd = 1,
        cityInd = 2,
        payentInd = 6,
        dateInd = 7,
        accountNumInd = 8,
        serviceInd = 9
    }
    public class TransactionConverter
    {
        public Transaction StrToTransaction(string strTransaction)
        {
            string[] fields = strTransaction.Split(new char[] { ' ', ',', '“', '”' }, StringSplitOptions.RemoveEmptyEntries);
            Transaction transaction = new Transaction()
            {
                Name = fields[(int)FieldsIndices.nameInd] + " " + fields[(int)FieldsIndices.surnameInd],
                City = fields[(int)FieldsIndices.cityInd],
                Payment = decimal.Parse(fields[(int)FieldsIndices.payentInd], CultureInfo.InvariantCulture),
                Date = DateTime.ParseExact(fields[(int)FieldsIndices.dateInd], "yyyy-mm-dd", CultureInfo.InvariantCulture),
                AccountNumber = long.Parse(fields[(int)FieldsIndices.accountNumInd]),
                Service = fields[(int)FieldsIndices.serviceInd]
            };
            return transaction;
        }
    }

Вопрос: Как это можно сделать проще или оптимизирование? Код получился запутанным.
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
HaJIuBauKa
@HaJIuBauKa
У вас же формат строки файла CSV.
Пробуйте общедоступные библиотеки для этого. Например вот такую:
https://joshclose.github.io/CsvHelper/getting-started/
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
freeExec
@freeExec
Участник OpenStreetMap
Можете ещё создать список с названием полей по порядку, и заполнять через рефлекшн. Но походу это не то, что вам нужно, раз вы в своём коде заплутали.
Ответ написан
Комментировать
NikFaraday
@NikFaraday
Student full-stack Developer
Используйте сериализацию JSON
Ответ написан
Комментировать
можно сделать более оптимизированно, если не аллоцировать для полей новые строки, а использовать IReadOnlySpan. Вот минимальный пример:
var input = "John Stockman|+17651233243";
var record = new Record(input);

Console.WriteLine($"Name: {record.Name} Phone: {record.Phone}");

class Record
{
    private string line;
    private int delimeterIndex;
    public Record(string line)
    {
        this.line = line;
        delimeterIndex = line.IndexOf('|');
    }
    public ReadOnlySpan<char> Name => line.AsSpan(0, delimeterIndex);
    public ReadOnlySpan<char> Phone => line.AsSpan(delimeterIndex + 1, line.Length - 1 - delimeterIndex);
    public override string ToString() => line;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы