Сократить множетсво if-else

321
29 июля 2017, 03:13

Есть метод который принимает строку и в зависимости от строки возвращает кортеж Tuple с одним int и одним string значением. Проблема в том, что если расписать это как if-else то получится более 20 вариантов. swith не сработает для непостоянного значения а тернарный оператор для 2 значений разного типа. Вопрос - как упростить данный метод :

public static Tuple<int, string> Divide(string SubClass)
{
    int Level = 0;
    string Class = string.Empty;
    try
    {
        if (SubClass.Contains("investment"))
        {
            Class = "bonds";
            RiscLevel = 2;
            return new Tuple<int, string>(RiscLevel, Class);
        }
        else if (SubClass.Contains("speculation"))
        {
            Class = "bonds";
            RiscLevel = 4;
            return new Tuple<int, string>(RiscLevel, Class);
        }
       // и еще много if-else
        return null;
    }
    catch (Exception ex)
    {
        BOX.ShowError(ex.Message, ex.Source);
        return null;
    }
}

В результате получается огромный массив if-else можно ли его как то сократить, сделать более удобочитаемым?

Answer 1

Материализуйте ваши варианты в виде структуры:

class Case
{
    public string SubClass { get; }
    public string Class  { get; }
    public int RiscLevel { get; }
}

Соответственно, ваш набор if-else превратится в foreach:

Case[] cases = { ... };
// ...
foreach (Case case in cases)
    if (SubClass.Contains(case.SubClass))
        return Tuple.Create(RiscLevel, Class);
return null;
Answer 2

Можно вынести "investment" и "speculation" в отдельный массив и получать нужный через linq:

var foo = new [] 
{ 
    //Желательно создать отдельный класс/структуру.
    new { Name = "speculation", RiscLevel = 4, Class = "bonds" },
    new { Name = "investment", RiscLevel = 2, Class = "bonds" },
};
var bar = foo.FirstOrDefault(s => SubClass.Contains(s.Name));
if (bar != null) 
{ 
    return new Tuple<int, string>(bar.RiscLevel, bar.Class);
}
READ ALSO
Получить имя столбца в DataTable

Получить имя столбца в DataTable

Выбираю адаптером таблицу из БДПримерно так :

285
Почему некорректно работает компонент Navs (Bootstrap 4) в связке с Vue.js?

Почему некорректно работает компонент Navs (Bootstrap 4) в связке с Vue.js?

Во Vue компоненте есть массив pages, каждый элемент которого представляет из себя хеш

262
Передать массив в функцию JS

Передать массив в функцию JS

Понятно, что вопрос слабенький и так себе, и решение не знать ну просто стыдно, но все же очень-очень нужна помощь

371