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

105
10 января 2017, 23:41

Здравствуйте, я только начинаю погружаться в мир разработки, хотелось спросить совета, как можно улучшить следующий код:

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 в перечисление более элегантным способом, по этому хотелось бы спросить вашего совета по улучшению читаемости кода и т.д.

Answer 1

В данном случае лучше не проходиться по всем значениям перечисления, а организовать свертку строки.

Для этого нужно разбить ее по разделителю ,, с помощью функции 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))
READ ALSO
An entity object cannot be referenced by multiple instances of IEntityChangeTracker

An entity object cannot be referenced by multiple instances of IEntityChangeTracker

Есть 3 сущности - репетитор, студент, группа, все связаны друг с другом через многие ко многимРешил сделать так: объявляю статическую переменную...

111
Добавление колонок в DataGridVew

Добавление колонок в DataGridVew

Добрый день! Мне нужно вывести в DataGridView колонки с именами субъектов (класс Subject) из коллекции subjects, но при этом присвоить колонке в поле Tag идентификатор...

102
Datagridview. Страничное представление

Datagridview. Страничное представление

Как лучше всего организовать страничное представление данных в гриде? Примерно 10 000 строк

53
Обновить сущность в бд по id

Обновить сущность в бд по id

Исключение типа "SystemInvalidOperationException" возникло в EntityFramework

104