Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

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

#c_sharp


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

public static Tuple Divide(string SubClass)
{
    int Level = 0;
    string Class = string.Empty;
    try
    {

        if (SubClass.Contains("investment"))
        {
            Class = "bonds";
            RiscLevel = 2;
            return new Tuple(RiscLevel, Class);
        }
        else if (SubClass.Contains("speculation"))
        {
            Class = "bonds";
            RiscLevel = 4;
            return new Tuple(RiscLevel, Class);
        }

       // и еще много if-else

        return null;
    }
    catch (Exception ex)
    {
        BOX.ShowError(ex.Message, ex.Source);
        return null;
    }
}


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


Ответы

Ответ 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;

Ответ 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(bar.RiscLevel, bar.Class); }

Комментариев нет:

Отправить комментарий