Function with a lot of if else blocks. Can they be removed

I have a function that should check the date and time for the delivered time. My function is shown below (it works great, but I don't like it). The only thing that needs to be changed is the statement, but currently I have several if, else if if etc and lines of code that have been copied.

I'm sure I'm stupid and is there a much better way to do this?

 enum DateTimeOperator
 {
        Equals = 0, GreaterThanOrEqualTo, GreaterThan, LessThan
 }

My function

 bool DateChecked(DateTime dateCheck DateTimeOperator dateOperator)
 {
       if(dateOperator == DateTimeOperator.Equals)
       {
           if (File.GetLastWriteTime(filePath + fileName).Date == dateCheck .Date)
                        return true;
                    else
                        return false;
       }
       else if(dateOperator == DateTimeOperator.GreaterThanOrEqualTo)
       {
           if (File.GetLastWriteTime(filePath + fileName).Date >= dateCheck .Date)
                        return true;
                    else
                        return false;
       }
       else if(dateOperator == DateTimeOperator.LessThan)
       {
           if (File.GetLastWriteTime(filePath + fileName).Date < dateCheck .Date)
                        return true;
                    else
                        return false;
       }
 }
+4
source share
3 answers

I would suggest an extension method: you don't need to put any switchor ifwhenever you want to compare dates with DateTimeOperator:

  public static class DateTimeOperatorExtensions {
    public static Func<Boolean, DateTime, DateTime> Comparison(this DateTimeOperator operation) {
      switch(operation) {
        //TODO: implenent other cases: i.e. DateTimeOperator.NotEquals here
        DateTimeOperator.Equals:
          return (left, right) => left == right;
        DateTimeOperator.GreaterThanOrEqualTo:
          return (left, right) => left >= right;  
        DateTimeOperator.LessThan:
          return (left, right) => left < right;   
        default: 
          return (left, right) => left == right; 
      }
    }
  }

  ...

  bool DateChecked(DateTime dateCheck DateTimeOperator dateOperator) {
    return dateOperator.Comparison()(dateCheck, File.GetLastWriteTime(filePath + fileName).Date);
  } 
+3
source

if/switch:

Dictionary<DateTimeOperator, Func<DateTime, DateTime, bool>> operatorComparer = new Dictionary<DateTimeOperator, Func<DateTime, DateTime, bool>>
{
    { DateTimeOperator.Equals, (a, b) => a == b },
    { DateTimeOperator.GreaterThanOrEqualTo, (a, b) => a >= b },
    { DateTimeOperator.GreaterThan, (a, b) => a > b },
    { DateTimeOperator.LessThan, (a, b) => a < b }
};

bool DateChecked(DateTime dateCheck, DateTimeOperator dateOperator)
{
   //TODO: add a sanity check
   return operatorComparer[dateOperator](File.GetLastWriteTime(filePath + fileName).Date, dateCheck .Date);
}
+4

, , ,

bool DateChecked(DateTime dateCheck DateTimeOperator dateOperator)
{
    var result = false;
    var myDate = File.GetLastWriteTime(filePath + fileName).Date;

    switch(dateOperator)
    {
        case DateTimeOperator.Equals:
            result = myDate == dateCheck.Date;
            break;
        case DateTimeOperator.GreaterThanOrEqualTo:
            result = myDate >= dateCheck.Date;
            break;
        case DateTimeOperator.LessThan:
            result =  myDate < dateCheck.Date;
            break;
    }

    return result;
}

return

bool DateChecked(DateTime dateCheck DateTimeOperator dateOperator)
{
    var myDate = File.GetLastWriteTime(filePath + fileName).Date;
    switch(dateOperator)
    {
        case DateTimeOperator.Equals:
            return myDate == dateCheck.Date;
        case DateTimeOperator.GreaterThanOrEqualTo:
            return myDate >= dateCheck.Date;
        case DateTimeOperator.LessThan:
            return myDate < dateCheck.Date;
    }
}
+2
source

Source: https://habr.com/ru/post/1607614/


All Articles