Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何缩短具有多个条件的if语句?_C#_.net - Fatal编程技术网

C# 如何缩短具有多个条件的if语句?

C# 如何缩短具有多个条件的if语句?,c#,.net,C#,.net,我开始解决客户签名显示不正确的问题。客户有两列,一列用于当前时间,另一列用于以前的时间,因此他们可以有五个结果: Current new These two we just need to show the CurrDate Prior New This hits the 1st ret Current New This hits the 3rd ret Prior Null Current old These three we need to show the Prev

我开始解决客户签名显示不正确的问题。客户有两列,一列用于当前时间,另一列用于以前的时间,因此他们可以有五个结果:

Current new  These two we just need to show the CurrDate
Prior New      This hits the 1st ret

Current New    This hits the 3rd ret
Prior Null

Current old  These three we need to show the PrevDate
Prior old      This hits the 2nd ret

Current new    This hits the 2nd ret
Prior old

Current old    This hits the 4th ret
Prior null
我得到了这个if声明

    private string CheckBoxDescription()
    {
        if (ViewState["PrevDate"] != null &&
            ViewState["PrevDate"].ToString().Trim() != "" && 
            ViewState["CurrDate"] != null && 
            ViewState["CurrDate"].ToString().Trim() != "")
        {
            if (DateTime.Parse(ViewState["PrevDate"].ToString()) > 
                   DateTime.Parse("01-JAN-12") &&
                DateTime.Parse(ViewState["CurrDate"].ToString()) >
                  DateTime.Parse("01-JAN-12"))
            {
                return "SELECT Statement to get CurrDate;
            }
            else
            {
                return "SELECT Statement to get PrevDate;
            }
        }

        if (DateTime.Parse(ViewState["CurrDate"].ToString()) >
            DateTime.Parse("01-JAN-12"))
        {
            return "SELECT Statement to get CurrDate (Same as the CurrDate above);
        }
        else
        {
            return "SELECT Statement to get PrevDate (Same as the PrevDate above);
        }
    }
我试过这个:

    if (DateTime.Parse(ViewState["CurrDate"].ToString()) > 
          (DateTime.Parse("011-JAN-12")) &
       (DateTime.Parse(ViewState["PrevDate"].ToString()) > 
          (DateTime.Parse("011-JAN-12")) | 
       (DateTime.Parse(ViewState["PrevDate"].ToString()) !=
           null)))

但它不会拾取其中一个空值

对于空/空检查,可以使用
String.IsNullOrWhitespace

if (!string.IsNullOrWhiteSpace(ViewState["PrevDate"]) &&
    !string.IsNullOrWhiteSpace(ViewState["CurrDate"]))
我还将解析的日期存储在变量中,而不是每次都进行解析

DateTime minDate  = new DateTime(2012,1,1);
DateTime prevDate = DateTime.Parse(ViewState["PrevDate"]));
DateTime currDate = DateTime.Parse(ViewState["CurrDate"]));
然后在比较中使用:

if (prevDate > minDate &&
    currDate > minDate)
对于最后一个检查,
DateTime.Parse
将永远不会返回null,因此我不确定您试图在那里检查的条件是什么。如果字符串值可以为null,则只需检查:

if (currDate > minDate &
       (ViewState["PrevDate"] == null ||
        prevDate > minDate)
   )

对于空/空检查,可以使用
String.IsNullOrWhitespace

if (!string.IsNullOrWhiteSpace(ViewState["PrevDate"]) &&
    !string.IsNullOrWhiteSpace(ViewState["CurrDate"]))
我还将解析的日期存储在变量中,而不是每次都进行解析

DateTime minDate  = new DateTime(2012,1,1);
DateTime prevDate = DateTime.Parse(ViewState["PrevDate"]));
DateTime currDate = DateTime.Parse(ViewState["CurrDate"]));
然后在比较中使用:

if (prevDate > minDate &&
    currDate > minDate)
对于最后一个检查,
DateTime.Parse
将永远不会返回null,因此我不确定您试图在那里检查的条件是什么。如果字符串值可以为null,则只需检查:

if (currDate > minDate &
       (ViewState["PrevDate"] == null ||
        prevDate > minDate)
   )
从您在第二段代码中所做的工作来看,这是我可以更改的内容,但我所做的只是删除了else语句,因为您在返回第一条if语句时,不需要else语句


从您在第二段代码中所做的工作来看,这是我可以更改的内容,但我所做的只是删除了else语句,因为您在返回第一条if语句时,不需要else语句

你的朋友:案例陈述

多个if语句也有减慢代码速度的习惯,因为IDE必须处理所有条件


对于Case语句,它只会根据条件使用某些信息

您的朋友:Case语句

多个if语句也有减慢代码速度的习惯,因为IDE必须处理所有条件


对于Case语句,它将只使用基于条件的某些信息

您可以通过编写一个方法将字符串解析为可为空的日期来大大简化这一过程:

private static DateTime? parseDate(object date)
{
    DateTime result;

    if (DateTime.TryParse(date.ToString(), out result))
        return result;

    return null;
}
请注意,我必须将参数设置为
对象
,因为我不知道
ViewState[“key”]
返回什么类型

一个可以简化代码的工具。但是,这样做表明您没有处理
currDate
不是有效日期的情况:

private string CheckBoxDescription()
{
    var prevDate = parseDate(ViewState["PrevDate"]);
    var currDate = parseDate(ViewState["CurrDate"]);

    if (prevDate != null && currDate != null)
    {
        return 
            prevDate > DateTime.Parse("01-JAN-12") && currDate > DateTime.Parse("01-JAN-12") 
            ? "SELECT Statement to get CurrDate" 
            : "SELECT Statement to get PrevDate";
    }

    // You have a problem here. What if currDate is not a valid date?

    if (currDate == null)
        throw new InvalidOperationException("Your current code doesn't handle this case.");

    if (currDate > DateTime.Parse("01-JAN-12"))
    {
        return "SELECT Statement to get CurrDate (Same as the CurrDate above)";
    }
    else
    {
        return "SELECT Statement to get PrevDate (Same as the PrevDate above)";
    }
}

通过编写一个方法将字符串解析为可为空的日期,可以大大简化此过程:

private static DateTime? parseDate(object date)
{
    DateTime result;

    if (DateTime.TryParse(date.ToString(), out result))
        return result;

    return null;
}
请注意,我必须将参数设置为
对象
,因为我不知道
ViewState[“key”]
返回什么类型

一个可以简化代码的工具。但是,这样做表明您没有处理
currDate
不是有效日期的情况:

private string CheckBoxDescription()
{
    var prevDate = parseDate(ViewState["PrevDate"]);
    var currDate = parseDate(ViewState["CurrDate"]);

    if (prevDate != null && currDate != null)
    {
        return 
            prevDate > DateTime.Parse("01-JAN-12") && currDate > DateTime.Parse("01-JAN-12") 
            ? "SELECT Statement to get CurrDate" 
            : "SELECT Statement to get PrevDate";
    }

    // You have a problem here. What if currDate is not a valid date?

    if (currDate == null)
        throw new InvalidOperationException("Your current code doesn't handle this case.");

    if (currDate > DateTime.Parse("01-JAN-12"))
    {
        return "SELECT Statement to get CurrDate (Same as the CurrDate above)";
    }
    else
    {
        return "SELECT Statement to get PrevDate (Same as the PrevDate above)";
    }
}
这个怎么样,

private string CheckBoxDescription()
{
    var prevDate = ViewState["PrevDate"] != null && ViewState["PrevDate"].ToString().Trim() != ""
    ? DateTime.Parse(ViewState["PrevDate"].ToString()) 
    : null;
    var currDate = ViewState["PrevDate"] != null && ViewState["CurrDate"].ToString().Trim() != "" 
    ? DateTime.Parse(ViewState["CurrDate"].ToString()) 
    : null;

    if (prevDate != null && currDate != null)
    {

       return 
        prevDate > DateTime.Parse("01-JAN-12") && currDate > DateTime.Parse("01-JAN-12") 
        ? "SELECT Statement to get CurrDate" 
        : "SELECT Statement to get PrevDate";
    }

    if (currDate > DateTime.Parse("01-JAN-12"))
    {
        return "SELECT Statement to get CurrDate (Same as the CurrDate above);
    }
    else
    {
        return "SELECT Statement to get PrevDate (Same as the PrevDate above);
    }
}
这个怎么样,

private string CheckBoxDescription()
{
    var prevDate = ViewState["PrevDate"] != null && ViewState["PrevDate"].ToString().Trim() != ""
    ? DateTime.Parse(ViewState["PrevDate"].ToString()) 
    : null;
    var currDate = ViewState["PrevDate"] != null && ViewState["CurrDate"].ToString().Trim() != "" 
    ? DateTime.Parse(ViewState["CurrDate"].ToString()) 
    : null;

    if (prevDate != null && currDate != null)
    {

       return 
        prevDate > DateTime.Parse("01-JAN-12") && currDate > DateTime.Parse("01-JAN-12") 
        ? "SELECT Statement to get CurrDate" 
        : "SELECT Statement to get PrevDate";
    }

    if (currDate > DateTime.Parse("01-JAN-12"))
    {
        return "SELECT Statement to get CurrDate (Same as the CurrDate above);
    }
    else
    {
        return "SELECT Statement to get PrevDate (Same as the PrevDate above);
    }
}

我忘记了语法,但对于C#6,我认为有一个缩短的空值检查。什么版本?你可以用!String.IsNullOrWhiteSpace(ViewState[“PrevDate”])作为单个检查,使用trim进行空检查和空字符串检查。我还将所有
ViewState[“Key”]
存储到它自己的局部变量中,这样你就不必每次访问值时都查询
ViewState
,你能用简单的词描述你的需求吗?您的代码很长,分支太多。一些语法/框架可以稍微减少代码长度,但却无法帮助您编写干净的代码。正如jamie所指出的:重复访问数组元素(就像重复铸造和转换它们一样)需要空间和时间。强烈建议使用局部变量!我忘记了语法,但对于C#6,我认为有一个缩短的空值检查。什么版本?你可以用!String.IsNullOrWhiteSpace(ViewState[“PrevDate”])作为单个检查,使用trim进行空检查和空字符串检查。我还将所有
ViewState[“Key”]
存储到它自己的局部变量中,这样你就不必每次访问值时都查询
ViewState
,你能用简单的词描述你的需求吗?您的代码很长,分支太多。一些语法/框架可以稍微减少代码长度,但却无法帮助您编写干净的代码。正如jamie所指出的:重复访问数组元素(就像重复铸造和转换它们一样)需要空间和时间。强烈建议使用局部变量!