多个相等的ifs应该从不同的方法(C#)返回不同的值?

时间:2011-05-18 13:54:43

标签: c# if-statement return-value

我有一些方法可以使用if条件,如:

string method1()
{
    bool x= Convert.ToBoolean(...);
    bool y= Convert.ToBoolean(...);

     if (x && y)
     {
         return " ";
     }

     if (!x && y)
     {
         return " ";
      }

      if (!y && x)
      {
          return " ";
      }

      if (!x && !y)
      {
          return "X";
      }

      return " ";
  }

这是我的第一个方法,现在我有一个类似的方法,它具有相同的检查和相同的布尔值,但返回其他字符串(不是空格或X)。什么是解决这个问题的主要方法?

由于

6 个答案:

答案 0 :(得分:4)

根据您的代码,如果x和y都为假,则只返回“X”。在这种情况下,每个其他组合应返回“”。这可以缩短,但为了便于阅读,我将其保留。

method1("X", " ");
method1("OtherValue", " ");

string method1(string matchValue, string nonMatchValue)
{
    bool x= Convert.ToBoolean(...);
    bool y= Convert.ToBoolean(...);

      if (!x && !y)
      {
          return matchValue;
      }

      return nonMatchValue;
  }

答案 1 :(得分:2)

为什么不将所需的返回值作为参数传递给方法?

string method1(string returnVal1, string returnVal2)
{
    bool x= Convert.ToBoolean(...);
    bool y= Convert.ToBoolean(...);

    if (x && y)
    {
        return returnVal1;
    }

    if (!x && y)
    {
        return returnVal1;
    }

    if (!y && x)
    {
        return returnVal1;
    }

    if (!x && !y)
    {
        return returnVal2;
    }

    return returnVal1;
}

答案 2 :(得分:2)

优雅的方法是重构代码,以便布尔检查在他们自己的方法中,其他两个方法中的每一个都可以访问,然后每个方法都可以根据布尔检查的结果返回一个字符串。

示例

private int BinaryTruthTest(bool x, bool y)
{
   if(x && y)
   {
      return 3;
   }
   if(!x && y)
   {
      return 1;
   }
   if(!y && x)
   {
      return 2;
   }
   if(!x && !y)
   {
      return 0;
   }
}

string method1()
{
   bool x = Convert.ToBoolean(...);
   bool y = Convert.ToBoolean(...);

   int testResult = BinaryTruthTest(x, y);

   if(testResult==0)
   {
      return "X";
   }
   else
   {
      return " ";
   }
}

答案 3 :(得分:0)

不确定您要做什么,但如果您想要只有结果发生变化的该方法的通用版本,您可以将结果作为二维数组传递....

string method1(string[][] result) {
   bool x= Convert.ToBoolean(...);
   bool y= Convert.ToBoolean(...);
   int u = (x ? 1 : 0);
   int v = (y ? 1 : 0);
   return result[u][v];
}

答案 4 :(得分:0)

这取决于现实世界的问题,但我怀疑你需要一个可以在任何地方重复使用的新类:

class DecisionMaker
{
    string _both;
    string _notX;
    string _notY;
    string _neither;
    string _default;

    public DecisionMaker(string both, string notX, string notY, string neither, string defaultVal)
    {
        _both = both;
        _notX = notX;
        _notY = notY;
        _neither = neither;
        _default = defaultVal;
    }

    public string Method1(bool x, bool y)
    {
        if (x && y)
            return _both;

        if (!x && y)
            return _notX;

        if (!y && x)
            return _notY;

        if (!x && !y)
            return _neither;

        return _default;
    }
}

或者可选地,您可以在Method1中包含Convert.ToBoolean(...)内容,并使Method1没有参数。或者,您可以使用受保护的抽象方法创建DecisionMakerBase抽象类,这样您只需更改需要更改的功能。这实际上取决于你的情况。

答案 5 :(得分:0)

如果您希望方法二为四种不同的情况返回四个不同的值,那么您可以这样做:

string method1(string[] values)
{
if (x && y)
 {
     return values[0];
 }

 if (!x && y)
 {
     return values[1];
  }

  if (!y && x)
  {
      return values[2];
  }

  if (!x && !y)
  {
      return values[3];
  }

}

然而,这不是很漂亮。 在您的应用程序中使用此方法有什么用?