Как динамически передать значение перечисления DaysOfTheWeek через код

avatar
vijay
8 апреля 2018 в 10:32
373
4
0

У меня есть приведенное ниже значение перечисления в классе планировщика задач, пока я создаю задачу, мне нужно добавить дни недели в зависимости от выбора флажка. Если установлен флажок понедельник, мне нужно пройти только понедельник (или иногда несколько дней, если также установлены другие флажки).

Как в приведенном ниже коде динамически передать несколько дней?

public enum DaysOfTheWeek: short
{
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64,
    AllDays = 127
}

DaysOfWeek = DaysOfTheWeek.Monday | DaysOfTheWeek.Sunday;
Источник
Nick
8 апреля 2018 в 10:45
0

Каков тип DaysOfWeek? Если это short, он должен работать так, как вы это сделали.

vijay
8 апреля 2018 в 10:47
0

но я не хочу проходить таким образом. Я хочу пройти через цикл в зависимости от выбранного флажка

John Nyingi
8 апреля 2018 в 11:35
0

используйте switch case, где, если выбрано число дней, оно выбирает свое значение

Ответы (4)

avatar
Stephen Kennedy
8 апреля 2018 в 11:47
0

Украсьте перечисление атрибутом Flags:

[Flags]
public enum DaysOfTheWeek : short

Объявите переменную DaysOfTheWeek и инициализируйте ее нулем:

DaysOfTheWeek days = 0;

Добавить флаги к значению перечисления для каждого отмеченного дня. Замените здесь bool sunday = true, wednesday = true; своим кодом, который проверяет флажки:

bool sunday = true, wednesday = true; // this is just proof of concept

if (sunday)
    days |= DaysOfTheWeek.Sunday;
if (wednesday)
    days |= DaysOfTheWeek.Wednesday;

days вывод:

Воскресенье, Среда

avatar
Daniel
8 апреля 2018 в 12:00
0

Как предложил Шахриар Голами, здесь полный код:

class Program
{
    static void Main(string[] args)
    {
        var daysOfWeek = GetDaysOfTheWeek(new List<DaysOfTheWeek> {DaysOfTheWeek.Monday, DaysOfTheWeek.Sunday});
        Console.WriteLine(daysOfWeek); //3
    }

    public static DaysOfTheWeek GetDaysOfTheWeek(List<DaysOfTheWeek> selectedDays)
    {
        var daysOfTheWeek = DaysOfTheWeek.None;
        foreach (var day in selectedDays)
        {
            daysOfTheWeek = daysOfTheWeek | day;
        }
        return daysOfTheWeek;
    }
}

[Flags]
public enum DaysOfTheWeek : short
{
    None = 0,
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64,
    AllDays = 127
}
avatar
ctyar
8 апреля 2018 в 11:44
1

Вы можете пройтись по списку выбора следующим образом и создать значение перечисления:

var days = new[] {1, 4, 32};

var daysOfTheWeek = DaysOfTheWeek.None;
foreach (var day in days)
{
    daysOfTheWeek = daysOfTheWeek | (DaysOfTheWeek) day;
}

[Flags]
public enum DaysOfTheWeek
{
    None = 0,
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64,
    AllDays = 128
}
avatar
Nick
8 апреля 2018 в 11:43
0

В вашем вопросе цикл не упоминается, но в вашем ответе на мой комментарий упоминается. Вы имеете в виду что-то вроде:

DaysOfWeek = DaysOfTheWeek.Monday | DaysOfTheWeek.Sunday;

foreach (int day in Enum.GetValues(typeof(DaysOfTheWeek)))
{
    if ( day & DaysOfWeek ) {
        /* do something for this day */
    }
}