Условная оптимизация / читабельность - PullRequest
0 голосов
/ 12 апреля 2019

В настоящее время у меня есть контроллер, который читает текстовый файл, проверяет данные, а затем выводит их в представление.Мне было интересно, может быть, есть ли лучший способ выполнить мою проверку?

Здесь я читаю свой файл и проверяю.Как вы можете видеть, мой чек довольно длинный, и после того, как я добавлю еще 3 или 4 условных выражения, он может оказаться нечитаемым, если его еще нет.Любые предложения будут оценены!

using (var sr = new StreamReader(newFullPath))
{
    while ((strbuild = sr.ReadLine()) != null)
    {
        var strArray = strbuild.Split('|');
        string INum = string.Empty,
            IDate = string.Empty,
            site = string.Empty,
            PG = string.Empty,
            errors = string.Empty;

        if (strArray[0] == "1")
        {
            FileCheck(strArray, out INum, out IDate, out site, out PG, out errors);
            var model = new UploadFileValidation
            {
                InvoiceNumber = INum,
                Errors = errors
            };
            validateOutput.Add(model);
        }
    }

    return View(validateOutput);
}

Чек ниже

private void FileCheck(string[] strArray, out string INum, out string IDate, out string site, out string PG, out string errors)
{
    INum = strArray[1];
    IDate = strArray[2];
    errors = "";
    site = strArray[10];
    var check = strArray.ElementAtOrDefault(11) != null;
    if (check)
        PG = strArray[11];
    else
        PG = "";
    string[] errorformats = { $"Unsupported date format of {IDate}.", "Site is missing", "Invalid Pay group" };
    string[] format = { "MM/dd/yyyy", "M/dd/yyyy", "MM/d/yyyy", "M/d/yyyy" };
    DateTime dateTime;
    if (!DateTime.TryParseExact(IDate, format, CultureInfo.InvariantCulture,
DateTimeStyles.None, out dateTime))
        errors = $"{errorformats[0]}";
    if (PG == "" && errors != "")
        errors = $"{errors}<br>{errorformats[2]}";
    else if (PG == "" && errors == "")
        errors = $"{errors}<br>{errorformats[1]}";
    if (site == "" && errors != "")
        errors = $"{errors}<br>{errorformats[1]}";
    else if (site == "" && errors == "")
        errors = $"{errorformats[1]}";
}

Вот конечный результат Example

1 Ответ

1 голос
/ 12 апреля 2019

Вы можете использовать string.Join для объединения нескольких ошибок с <br>:

private void FileCheck(string[] strArray, out string invoiceNum, out string date, out string site, out string pg, out string errorMessage)
{
    var errors = new List<string>();

    invoiceNum = strArray[1];
    date = strArray[2];
    site = strArray[10];
    pg = strArray.ElementAtOrDefault(11) ?? string.Empty;

    var validDateFormats = new[] { "MM/dd/yyyy", "M/dd/yyyy", "MM/d/yyyy", "M/d/yyyy" };
    if (!DateTime.TryParseExact(date, validDateFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out _))
        errors.Add($"Unsupported date format of {date}.");

    if (pg == "")
        errors.Add("Invalid Pay group");

    if (site == "")
        errors.Add("Site is missing");

    errorMessage = string.Join("<br>", errors);
}

Если вас не волнует результат out, вы можете просто использовать out _, чтобы игнорировать его. Вы даже можете игнорировать несколько из них, например:

FileCheck(strArray, out var invoiceNum, out _, out _, out _, out var errors);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...