простой код:
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
Чего мне здесь не хватает?
Дни недели не являются битовыми флагами. http://msdn.microsoft.com/en-us/library/system.datetime.dayofweek.aspx
Значение констант в перечислении перечисления DayOfWeek варьируется от DayOfWeek.Sunday до DayOfWeek.Saturday. При приведении к целое число, его значение варьируется от нуля (что указывает на день недели - воскресенье) до шести (что указывает на DayOfWeek.Saturday).
Вы можете создать собственное перечисление DayOfWeek, если вам нужно использовать его как флаги:
[Flags]
public enum MyDayOfWeek { Sunday = 1, Monday = 2, Tuesday = 4, ... , Saturday = 64 };
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,
}
Перечисление DayOfWeek
было разработано для представления одного дня недели, а не набора дней.
Вы не получите ошибку компилятора при использовании &
, поскольку перечисления являются целыми числами, но оператор не делает то, что вы ожидаете (если только вы не планируете события только по понедельникам, вторникам или четвергам). ).
Если вам нужен битовый флаг, объявите тип битового флага, как предложил Рэй.