Refactoring Switch C # statements

The purpose of the code below is to determine whether a particular date corresponds to "days off" after 12:00 p.m. on Thursday, at least 2 days, and until Monday 12:00 p.m.

Is there a better way? If-Else is getting ugly, and the strategy template works too much for this.

public bool ValidateWeekend(DateTime pickupDate, DateTime dropoffDate) { TimeSpan ts = dropoffDate.Subtract(pickupDate); if (ts.TotalDays >= 2 && ts.TotalDays <= 4) { switch (pickupDate.DayOfWeek) { case DayOfWeek.Thursday: if (pickupDate.Hour >= 12) { switch (dropoffDate.DayOfWeek) { case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: if (dropoffDate.Hour <= 12) { return true; } return false; } } break; case DayOfWeek.Friday: switch (dropoffDate.DayOfWeek) { case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: if (dropoffDate.Hour <= 12) { return true; } return false; } break; case DayOfWeek.Saturday: switch (dropoffDate.DayOfWeek) { case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: if (dropoffDate.Hour <= 12) { return true; } return false; } return false; } } return false; } 
+4
source share
9 answers

You should definitely reorganize dropoffDate, because the code is duplicated 3 times! The simplest cleanup: I would introduce pickupDate validation function and another to test dropoffDate:

 private bool IsPickupWeekend(DateTime pickupDate) { switch (pickupDate.DayOfWeek) { case DayOfWeek.Thursday: return pickupDate.Hour >= 12; case DayOfWeek.Friday: case DayOfWeek.Saturday: return true; } } return false; } private bool IsWeekendDropOff(DateTime dropoffDate) { switch (dropoffDate.DayOfWeek) { case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: if (dropoffDate.Hour <= 12) { return true; } return false; } return false; } 

And now your main function is 2 liners:

 if (ts.TotalDays >= 2 && ts.TotalDays <= 4) { return IsPickupWeekend(pickupDate) && IsWeekendDropOff(dropoffDate); } 
+6
source

I think you could extract a method here:

 private bool ValidateDropoff(DateTime dropoffDate) { switch (dropoffDate.DayOfWeek) { case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: return dropoffDate.Hour <= 12; default: return false; } } 
+3
source
 if (ts.TotalDays >= 2 && ts.TotalDays <= 4) { var hour_limit = new Func<Boolean>(() => { switch (dropoffDate.DayOfWeek) { case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: return dropoffDate.Hour <= 12; default: return false; } }); switch (pickupDate.DayOfWeek) { case DayOfWeek.Thursday: if (pickupDate.Hour >= 12) return hour_limit(); break; case DayOfWeek.Friday: case DayOfWeek.Saturday: return hour_limit(); default: break; } } return false; 
+1
source

Not much clearer, but here you go:

 public bool ValidateWeekend(DateTime pickupDate, DateTime dropoffDate){ TimeSpan ts = dropoffDate.Subtract(pickupDate); if (ts.TotalDays >= 2 && ts.TotalDays <= 4){ switch (pickupDate.DayOfWeek){ case DayOfWeek.Thursday: if (pickupDate.Hour >= 12){ switch (dropoffDate.DayOfWeek){ case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: return dropoffDate.Hour <= 12; } } break; case DayOfWeek.Friday: switch (dropoffDate.DayOfWeek){ case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: return dropoffDate.Hour <= 12; } break; case DayOfWeek.Saturday: switch (dropoffDate.DayOfWeek){ case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: return dropoffDate.Hour <= 12; } return false; } } return false; } 
0
source

My first crack:

 if (ts.TotalDays >= 2 && ts.TotalDays <= 4) { switch (pickupDate.DayOfWeek) { case DayOfWeek.Thursday: case DayOfWeek.Friday: case DayOfWeek.Saturday: if (pickupDate.DayOfWeek == DayOfWeek.Thursday && pickupDate.Hour <= 12) return false; switch (dropoffDate.DayOfWeek) { case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: return dropoffDate.Hour <= 12; } return false; default: return false; } } return false; 
0
source

in the switch try

 retrun (dropoffDate.DayOfWeek == DayOfWeek.Sunday && dropoffDate.Hour <= 12 || dropoffDate.DayOfWeek == DayOfWeek.Sunday) 
0
source

I would do something like this

 public bool ValidateWeekend(DateTime pickupDate, DateTime dropoffDate) { TimeSpan ts = dropoffDate.Subtract(pickupDate); if (ts.TotalDays >= 2 && ts.TotalDays <= 4) { switch (pickupDate.DayOfWeek) { case DayOfWeek.Thursday: if (pickupDate.Hour >= 12) { reurn DayOfWeek(dropOffDate.DayOfWeek); } break; case DayOfWeek.Friday, DayOfWeek.Saturday: { return DayOfWeek(dropOffDate.DayOfWeek); } } } return false; } public bool DayOfWeek(DateTime dropOffDate) { switch (dropoffDate.DayOfWeek) { case DayOfWeek.Sunday: { return true; } case DayOfWeek.Monday: { if (dropoffDate.Hour <= 12) { return true; } return false; } return false; } } 
0
source

Here is my hit:

  /// <summary> /// Gets the weekend days. /// </summary> /// <returns></returns> public List<DayOfWeek> GetWeekendDays() { List<DayOfWeek> days = new List<DayOfWeek>() { DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Sunday }; return days; } /// <summary> /// Validates the weekend. /// </summary> /// <param name="pickupDate">The pickup date.</param> /// <param name="dropoffDate">The dropoff date.</param> /// <returns></returns> public bool ValidateWeekend(DateTime pickupDate, DateTime dropoffDate) { bool isValid = false; TimeSpan ts = dropoffDate.Subtract(pickupDate); if (ts.TotalDays >= 2 && ts.TotalDays <= 4) { List<DayOfWeek> days = GetWeekendDays(); foreach (DayOfWeek day in days) { if(pickupDate.DayOfWeek == day) { isValid = ValidateDropOff(dropoffDate); break; } } } return isValid; } /// <summary> /// Validates the drop off. /// </summary> /// <param name="dropoffDate">The dropoff date.</param> /// <returns></returns> private static bool ValidateDropOff(DateTime dropoffDate) { bool isValidDropOff = (dropoffDate.DayOfWeek == DayOfWeek.Sunday); if(dropoffDate.DayOfWeek == DayOfWeek.Monday) { if (dropoffDate.Hour <= 12) { isValidDropOff = true; } } return isValidDropOff; } 
0
source
  private readonly TimeSpan Midday = new TimeSpan(12, 0, 0); public bool ValidateWeekend(DateTime pickupDate, DateTime dropoffDate) { TimeSpan lengthOfTrip = dropoffDate.Subtract(pickupDate); if (lengthOfTrip.TotalDays < 2 || lengthOfTrip.TotalDays > 4) return false; return IsPickupDateConsideredWeekend(pickupDate) && IsDropoffDateConsideredWeekend(dropoffDate); } private bool IsPickupDateConsideredWeekend(DateTime pickupdate) { if (pickupdate.DayOfWeek == DayOfWeek.Thursday && pickupdate.TimeOfDay > Midday) return true; return false; } private bool IsDropoffDateConsideredWeekend(DateTime dropoffDate) { if (dropoffDate.DayOfWeek == DayOfWeek.Monday && dropoffDate.TimeOfDay <= Midday) return true; return false; } 
0
source

All Articles