多条件If语句

时间:2015-09-15 13:31:07

标签: c# if-statement

我写了一个如下所示的条件语句。本声明的目的是根据另一组条件检查一组条件。

如下所示:

else if ((Convert.ToString(dRow[UtilityEntity.FranceColumnGS]) == "x" || 
          Convert.ToString(dRow[UtilityEntity.FranceColumnHQ]) == "x" ||
          Convert.ToString(dRow[UtilityEntity.FranceColumnIO]) == "x" || 
          Convert.ToString(dRow[UtilityEntity.FranceColumnJM]) == "x") && 
         (Convert.ToString(dRow[UtilityEntity.FranceColumnHB]) == "x" || 
          Convert.ToString(dRow[UtilityEntity.FranceColumnHZ]) == "x" || 
          Convert.ToString(dRow[UtilityEntity.FranceColumnIX]) == "x" || 
          Convert.ToString(dRow[UtilityEntity.FranceColumnJV]) == "x"))
{
    excelWorksheet.Cells["AV" + rowIndex].Value = "both";
}

目前有效,但我确信这可以降低效率。

任何人都可以建议或提供一些暗示如何缩短此声明。

3 个答案:

答案 0 :(得分:4)

作为样本如何完成:

var firstConditionColumns = new[] {
    UtilityEntity.FranceColumnGS,
    UtilityEntity.FranceColumnHQ,
    UtilityEntity.FranceColumnIO,
    UtilityEntity.FranceColumn.JM };
var secondConditionColumns = new[] {
    UtilityEntity.FranceColumnHB,
    UtilityEntity.FranceColumnHZ,
    UtilityEntity.FranceColumnIX,
    UtilityEntity.FranceColumnJV };
if (firstConditionColumns.Any(o => Convert.ToString(dRow[o]) == "x") &&
    secondConditionColumns.Any(o => Convert.ToString(dRow[o]) == "x"))
{
    excelWorksheet.Cells["AV" + rowIndex].Value = "both";
}

答案 1 :(得分:1)

它足够有效。您正在使用使用延迟评估的||&&,因此只要知道结果,就不会再评估其余表达式。

尽管如此,它可以更具可读性和更少打字。

if (isX(UtilityEntity.FranceColumnGS) || isX(UtilityEntity.FranceColumnHQ) ...)
{
   ...
}


private bool isX(int index)
{
    return (Convert.ToString(dRow[index]) == "x");
}

答案 2 :(得分:0)

您可以为dbRow创建扩展方法。我不确定你的例子中是什么类,但作为一个例子我假设它是DbRow:

public static class DbRowExtension
{
    public static bool AnyColIsChecked(this DbRow source, string[] colNames)
    {
        return colNames.Any(x => source[x] == "X");
    }
}

然后您可以像这样编写if语句

if (dbRow.AnyColIsChecked(UtilityEntity.FranceColumnGS,
        UtilityEntity.FranceColumnHQ,
        UtilityEntity.FranceColumnIO,
        UtilityEntity.FranceColumn.JM) &&
    dbRow.AnyColIsChecked(UtilityEntity.FranceColumnHB,
        UtilityEntity.FranceColumnHZ,
        UtilityEntity.FranceColumnIX,
        UtilityEntity.FranceColumnJ))
{
    ...
}