Битовые флаги - Чего мне не хватает?

простой код:

protected void Page_Load(object sender, EventArgs e)
{
    DateTime now = DateTime.UtcNow;

    lit.Text += "<br/>now.DayOfWeek: " + now.DayOfWeek.ToString();

    // weekdays (Saturday is not included)
    DayOfWeek runningDays = DayOfWeek.Monday | DayOfWeek.Tuesday | DayOfWeek.Wednesday | DayOfWeek.Thursday | DayOfWeek.Friday;

    lit.Text += "<br/>" + runningDays.HasFlag(now.DayOfWeek);
    lit.Text += "<br/>" + runningDays.HasAny(now.DayOfWeek);
    lit.Text += "<br/>" + ((runningDays & now.DayOfWeek) != 0);

    // weekend (Saturday is in a weekend)
    runningDays = DayOfWeek.Saturday | DayOfWeek.Sunday;

    lit.Text += "<br/>" + runningDays.HasFlag(now.DayOfWeek);
    lit.Text += "<br/>" + runningDays.HasAny(now.DayOfWeek);
    lit.Text += "<br/>" + ((runningDays & now.DayOfWeek) != 0);
}

Помощник:

public static bool HasExactly(this DayOfWeek x, DayOfWeek y) { return x == y; }
public static bool HasAny(this DayOfWeek x, DayOfWeek y) { return 0 != (x & y); }
public static bool HasAll(this DayOfWeek x, DayOfWeek y) { return y == (x & y); }

сегодняшний вывод (суббота)

now.DayOfWeek: Saturday
True
True
True
True
True
True 

Но вывод должен быть таким:

now.DayOfWeek: Saturday
False
False
False
True
True
True 

Чего мне здесь не хватает?

6
задан balexandre 21 August 2010 в 18:05
поделиться

4 ответа

Дни недели не являются битовыми флагами. http://msdn.microsoft.com/en-us/library/system.datetime.dayofweek.aspx

Значение констант в перечислении перечисления DayOfWeek варьируется от DayOfWeek.Sunday до DayOfWeek.Saturday. При приведении к целое число, его значение варьируется от нуля (что указывает на день недели - воскресенье) до шести (что указывает на DayOfWeek.Saturday).

12
ответ дан 8 December 2019 в 05:19
поделиться

Вы можете создать собственное перечисление DayOfWeek, если вам нужно использовать его как флаги:

[Flags]
public enum MyDayOfWeek { Sunday = 1, Monday = 2, Tuesday = 4, ... , Saturday = 64 };
3
ответ дан 8 December 2019 в 05:19
поделиться

DayOfWeek имеет порядковые номера.

Используйте список .

Перейти к определению показывает:

// Summary:
//     Specifies the day of the week.
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
    // Summary:
    //     Indicates Sunday.
    Sunday = 0,
    //
    // Summary:
    //     Indicates Monday.
    Monday = 1,
    //
    // Summary:
    //     Indicates Tuesday.
    Tuesday = 2,
    //
    // Summary:
    //     Indicates Wednesday.
    Wednesday = 3,
    //
    // Summary:
    //     Indicates Thursday.
    Thursday = 4,
    //
    // Summary:
    //     Indicates Friday.
    Friday = 5,
    //
    // Summary:
    //     Indicates Saturday.
    Saturday = 6,
}
1
ответ дан 8 December 2019 в 05:19
поделиться

Перечисление DayOfWeek было разработано для представления одного дня недели, а не набора дней.

Вы не получите ошибку компилятора при использовании &, поскольку перечисления являются целыми числами, но оператор не делает то, что вы ожидаете (если только вы не планируете события только по понедельникам, вторникам или четвергам). ).

Если вам нужен битовый флаг, объявите тип битового флага, как предложил Рэй.

0
ответ дан 8 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: