#c_sharp
Есть метод, который принимает строку и в зависимости от строки возвращает кортеж Tuple с одним int и одним string значением. Проблема в том, что если расписать это как if-else то получится более 20 вариантов. switch не сработает для непостоянного значения, а тернарный оператор - для 2 значений разного типа. Вопрос - как упростить данный метод: public static TupleDivide(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); }
Комментариев нет:
Отправить комментарий