Страницы

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

суббота, 15 июня 2019 г.

Как можно улучшить участок кода?

Здравствуйте, я только начинаю погружаться в мир разработки, хотелось спросить совета, как можно улучшить следующий код:
JobKind jobKind = 0; foreach (JobKind value in Enum.GetValues(typeof(JobKind))) { var enumIntValue = (int)value;
if (model.JobKinds.Contains(enumIntValue.ToString())) { var checkedSymbol = char.Parse(enumIntValue.ToString()); if ((model.JobKinds.LastIndexOf(checkedSymbol) - model.JobKinds.IndexOf(checkedSymbol)) == 0) jobKind = jobKind | value; } }
JobKind - это перечисление с атрибутом [Flags]. На вход идет модель, которая содержит строковое поле - типы специальностей. Там идет перечисление. Для удобства, можно указать числами наборы специальностей (например, 2,4,5). Цифры равны значению полей в перечислении. Данный код, формирует битовое поле и перечисления из строки. Я не нашел, как можно сконвертировать строку вида 2,4,5 в перечисление более элегантным способом, по этому хотелось бы спросить вашего совета по улучшению читаемости кода и т.д.


Ответ

В данном случае лучше не проходиться по всем значениям перечисления, а организовать свертку строки.
Для этого нужно разбить ее по разделителю , с помощью функции Split, а затем свернуть, например воспользовавшись методом Aggregate
var jobKind = model.JobKinds.Split(',') .Aggregate((J)0, (acc, cur) => { var value = (J)int.Parse(cur); // приводим элемент из строки в число, и затем в значение enum return acc | value; // объединяем значения и возвращаем });
Немного более компактно вызов Aggregate может выглядеть так:
.Aggregate((J)0, (acc, cur) => acc | (J)int.Parse(cur))

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

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