功能有很多if else的块。可以删除这些

时间:2015-09-16 09:13:13

标签: c# .net

我有一个需要根据提供的日期时间检查日期时间的函数。我的功能如下所示(它工作正常,但我不喜欢它)。唯一需要改变的是运营商,但目前我有一些if,否则if&etc;已经复制的代码行。

我确定我是愚蠢的,还有更好的方法吗?

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

我的功能

 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;
       }
 }

3 个答案:

答案 0 :(得分:4)

只是为了在没有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);
}

答案 1 :(得分:3)

我建议使用扩展程序:只要您想使用switch比较日期,就无需添加任何ifDateTimeOperator

  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);
  } 

答案 2 :(得分:2)

这是我上面代码的版本,我认为它更简单,更易读

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;
}

或者如果您不喜欢一个退货声明

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;
    }
}