Здравствуйте, я только начинаю погружаться в мир разработки, хотелось спросить совета, как можно улучшить следующий код:
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))
Комментариев нет:
Отправить комментарий