Before reading ahead, I would strongly suggest to read about bitwise operations here, otherwise it will be very hard to understand the logic of the example.
So lets declare our bitwise flag enum:
[Flags] private enum DeliveryDays { NONE = 0, // 0000000 MON = 1, // 0000001 TUE = 2, // 0000010 WED = 4, // 0000100 THU = 8, // 0001000 FRI = 16, // 0010000 SAT = 32, // 0100000 SUN = 64, // 1000000 WORKDAYS = MON | TUE | WED | THU | FRI, //0011111 WEEKENDS = SAT | SUN //1100000 }The [Flags] attribute indicates that an enumeration can be treated as a bit field. Do use powers of two for a enumeration's values so they can be freely combined using the bitwise OR operation. As you can see for workdays and weekends we have combined the relevant days.
Now lets write down the methods which set these flags on or off.
private DeliveryDays _selectedDays = DeliveryDays.None; public void AddDeliveryDays(DeliveryDays days) { _selectedDays |= days; } public void RemoveDeliveryDays(DeliveryDays days) { _selectedDays &= ~days; } public void testDaysBitEnum() { //lets select monday and tuesday AddDeliveryDays(DeliveryDays.MON | DeliveryDays.TUE); //lets change it all the work days AddDeliveryDays(DeliveryDays.WorkDays); //now lets remove monday and tuesday and add weekends RemoveDeliveryDays(DeliveryDays.MON | DeliveryDays.TUE); AddDeliveryDays(DeliveryDays.WEEKENDS); }As shown above we can quickly toggle multiple flags. But we also need some functionality to find which flags have been selected. In .NET framework 4.0 the enum has a method called HasFlag which does this for you. For older frameworks you can use the following method.
public bool HasFlag(DeliveryDays day) { return ((_selectedDays & day) == day); }If you are using .NET 3.5 Framework it will be handy to add the above method as an Extension Method.
Very cool!
ReplyDeletenice man...keep it up.
ReplyDeletevery cool..
ReplyDeletethanks