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

C# 多个相等的ifs应该从不同的方法返回不同的值(C)?,c#,if-statement,return-value,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 &am

我有一些使用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。解决这个问题的基本方法是什么


谢谢

根据您的代码,如果X和y都为false,则只返回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;
  }

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

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

优雅的方法是重构代码,使布尔检查位于其他两个方法都可以访问的各自的方法中,然后每个方法都可以基于布尔检查的结果返回字符串

范例


不确定您想做什么,但是如果您想要该方法的通用版本,其中只更改结果,您可以将结果作为二维数组传递

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

这取决于实际问题,但我怀疑您需要一个可以在任何地方重用的新类:

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

或者,您可以选择使用Convert.ToBoolean。。。填充Method1中的内容并使Method1没有参数。或者,您可以使用受保护的抽象方法创建DecisionMakerBase抽象类,该抽象类只允许您更改需要更改的功能。这实际上取决于您的场景。

如果您希望方法二为四种不同的情况返回四个不同的值,那么您可以执行以下操作:

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

然而,这不是很漂亮。
此方法在应用程序中有何用途?

适用于空格情况,但不适用于每个if返回不同内容的情况。能否在代码中说明如何使用此方法。看起来你需要重新设计你的应用程序,这样你就不必这样做了。实际上,使这些条件测试可重用的唯一解决方案是从返回内容的代码中删除执行条件测试的代码。@grady我提供了一个示例。如果OP需要/想要执行相同的条件分析,但是需要返回整数而不是字符串吗?OP最终将复制/粘贴这段代码,这是不好的。@Phil,这很好,但条件和返回值之间仍然有非常紧密的耦合。如果出现第三种情况,例如x、y和z,而不仅仅是x和y,会发生什么?@Brian这确实取决于实际问题,但我敢打赌我们需要一个新类,而不是一个方法。我们只是对这个问题了解得不够。@Brian另外,看看你的代码,你所做的只是将布尔值转换成整数。如果testResult==0,则不再使用if x&&y。method1仍在做出决定。@Phil My代码允许在其他方法中轻松重用条件测试,这是OP要求的。OP可能不会只返回2个值中的1个。
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];
  }