Arhn - архитектура программирования

С# альтернатива множеству операторов else if, основанных на иерархии

Прошу прощения за расплывчатое название, но я не был уверен, как лучше всего его описать.

Я пишу сценарий преобразования С# в SSIS. Цель состоит в том, чтобы принять 5 значений, которые являются десятичными, и мне нужно получить первое значение из 5, которое не является нулевым, в заранее определенном порядке, как вы можете видеть по порядку else if заявления. Итак, как вы можете видеть, я хочу получить значение MM, если оно есть, если нет, то PRE, затем DD, PT и т. д. Вы также увидите, что я просто присваиваю небольшое значение метки varchar, чтобы показать, какое значение вернулось как хорошо.

Есть ли более чистый/простой способ сделать это, который не включает кучу блоков if/else if? Я просто ищу, чтобы очистить его.

текущий код ниже (спасибо за любой совет!):

public Tuple<decimal?,string> getCurrentRec(Decimal? PT, Decimal? DD, 
Decimal? PRE, Decimal? MM)
{
    string ptlabel = "PT";
    string ddlabel = "DD";
    string prelabel = "PRE";
    string MMLabel = "MM";
    string curlabel;
    decimal? currentval;

    if (MM.HasValue)
    {
        curlabel = MMLabel;
        currentval = MM.Value;
    }

    else if (PRE.HasValue)
    {
        curlabel = prelabel;
        currentval = PRE.Value;
    }

    else if (DD.HasValue)
    {
        curlabel = ddlabel;
        currentval = DD.Value;
    }
    else if (PA.HasValue)
    {
        curlabel = ptlabel;
        currentval = PT.Value;
    }
    else
    {
        curlabel = "";
        currentval = (decimal?)null;
    }

    return Tuple.Create(currentval, curlabel);
}

  • Если допустимо переменное количество параметров метода, используйте массив params; в противном случае поместите параметры в массив или список вручную в правильном порядке и выполните итерацию по ним. 15.02.2018
  • currentval = x ?? y ?? z ?? a; Если вам нужно еще и имя, создайте структуру данных, представляющую именованное значение. 15.02.2018
  • Это может быть лучше на Code Review, но прочтите эту статью перед публикацией. 15.02.2018
  • Вы делаете х ?? ты ?? г ?? ... к количеству параметров, которые у вас есть. Или примите параметры как десятичный массив параметров, затем выполните .FirstOrDefault(x => x.HasValue) в массиве. Если изменение параметров невозможно, вы можете добавить параметры в массив самостоятельно, а затем выполнить FirstOrDefault(x => x.HasValue) 15.02.2018
  • Если у вас есть доступ к самому SQL-запросу, вы можете использовать оператор coalesce. 15.02.2018

Ответы:


1

Один из возможных способов:

var match = new[] {
    new {v = MM, n = nameof(MM) },
    new {v = PRE, n = nameof(PRE) },
    new {v = DD, n = nameof(DD) },
    new {v = PT, n = nameof(PT) },
}.FirstOrDefault(c => c.v != null);
return Tuple.Create(match?.v, match?.n ?? "");

Вы создаете массив анонимных типов с двумя свойствами: v для значения вашего десятичного числа и n для соответствующей метки. Элементы в массиве должны быть в правильном порядке. Затем вы используете FirstOrDefault, чтобы найти первый элемент, который имеет ненулевое значение.

15.02.2018

2

Что-то вроде этого может выглядеть аккуратнее:

public Tuple<decimal?,string> evaluate(Decimal? d, string s)
{
    if (!d.HasValue)
        return null;

    return Tuple.Create(d, s);
}
public Tuple<decimal?,string> getCurrentRec(Decimal? PT, Decimal? DD, Decimal? PRE, Decimal? MM)
{
    return evaluate(PT, "PT")
        ?? evaluate(DD, "DD")
        ?? evaluate(PRE, "PRE")
        ?? evaluate(MM, "MM")
        ?? Tuple.Create(null, null);
}
15.02.2018
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..