C# 具有大量if-else';s街区。这些可以被移除吗

C# 具有大量if-else';s街区。这些可以被移除吗,c#,.net,C#,.net,我有一个函数,需要根据提供的datetime检查datetime。我的函数如下所示(工作正常,但我不喜欢)。唯一需要更改的是操作符,但目前我有一些if、else if等&已复制的代码行 我肯定我很愚蠢,有更好的方法吗 enum DateTimeOperator { Equals = 0, GreaterThanOrEqualTo, GreaterThan, LessThan } 我的职能 bool DateChecked(DateTime dateCheck DateT

我有一个函数,需要根据提供的datetime检查datetime。我的函数如下所示(工作正常,但我不喜欢)。唯一需要更改的是操作符,但目前我有一些if、else if等&已复制的代码行

我肯定我很愚蠢,有更好的方法吗

 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;
       }
 }
bool DateChecked(DateTime dateCheck DateTimeOperator dateOperator)
{
if(dateOperator==DateTimeOperator.Equals)
{
if(File.GetLastWriteTime(filePath+fileName).Date==dateCheck.Date)
返回true;
其他的
返回false;
}
else if(dateOperator==DateTimeOperator.GreaterThanOrEqualTo)
{
if(File.GetLastWriteTime(filePath+fileName).Date>=dateCheck.Date)
返回true;
其他的
返回false;
}
else if(dateOperator==DateTimeOperator.LessThan)
{
if(File.GetLastWriteTime(filePath+fileName).Date
这是我对上述代码的版本,我认为它更简单,可读性更强

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结果=假;
var myDate=File.GetLastWriteTime(文件路径+文件名).Date;
开关(操作员)
{
案例DateTimeOperator。等于:
结果=myDate==dateCheck.Date;
打破
case DateTimeOperator.GreaterThanOrEqualTo:
结果=myDate>=dateCheck.Date;
打破
案例DateTimeOperator.LessThan:
结果=myDate
或者如果你不喜欢一个返回语句

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;
    }
}
bool DateChecked(DateTime dateCheck DateTimeOperator dateOperator)
{
var myDate=File.GetLastWriteTime(文件路径+文件名).Date;
开关(操作员)
{
案例DateTimeOperator。等于:
return myDate==dateCheck.Date;
case DateTimeOperator.GreaterThanOrEqualTo:
返回myDate>=dateCheck.Date;
案例DateTimeOperator.LessThan:
返回myDate
只是为了好玩,没有
如果
/
开关

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);
}
字典运算符comparer=新字典
{
{DateTimeOperator.Equals,(a,b)=>a==b},
{DateTimeOperator.GreaterThanOrEqualTo,(a,b)=>a>=b},
{DateTimeOperator.GreaterThan,(a,b)=>a>b},
{DateTimeOperator.LessThan,(a,b)=>a
我建议一种扩展方法:当您想使用
DateTimeOperator
比较日期时,无需设置任何
开关
if

  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);
  } 
公共静态类DateTimeOperatorExtensions{
公共静态Func比较(此DateTimeOperator操作){
开关(操作){
//TODO:提示其他情况:即DateTimeOperator.NotEquals在此
DateTimeOperator.等于:
返回(左,右)=>左==右;
DateTimeOperator.GreaterThanOrEqualTo:
返回(左,右)=>左>=右;
DateTimeOperator.LessThan:
返回(左、右)=>左<右;
违约:
返回(左,右)=>左==右;
}
}
}
...
bool DateChecked(DateTime dateCheck DateTimeOperator dateOperator){
return dateOperator.Comparison();
} 

可以将
if
替换为
开关
…您可以将外部
if
替换为
开关
。由于条件是一个
枚举
,VS也将为您创建
案例
s。此外,如果使用三元运算符替换内部
if
s:
返回文件.GetLastWriteTime(…).Date==dateCheck.Date?true:false
或直接比较
返回文件.GetLastWriteTime(…).Date==dateCheck.Date绝对喜欢这一款的创意!我收到一条错误消息,说没有重载方法比较,需要两个参数?我把函数改为Func@mHelpMe:很抱歉输入错误:is应该是
Comparison()
(注意“()”),然后才是
(日期检查…