遍历循环并在两个表达式之间切换,唯一的区别是符号



>我可以从另一个方法返回一个方法吗?我正在循环,当条件为真时,我需要在 (y += x) 和 (y-= x) 之间切换。我想声明一个布尔值,当为真时,调用返回 (y += x) 的方法,当它为假时返回 (y+=x)。

这有可能做到吗,或者有没有更优雅的方法可以做到这一点......感谢代码示例。谢谢

进一步解释...如果列表包含例如 20 个项目。我遍历列表并使用 (y -= x) 做一些事情。如果条件为真,我需要继续循环并做一些事情,但这次是 (y+= x),直到条件再次为真......并再次恢复为 (y-=x) 依此类推。

是的,您可以从函数返回函数。有许多类型定义类型的签名。在您的情况下,您需要一个Func<T1, T2, TResult>或更具体地说是Func<int, int, int>。例如,你可以有一个Add函数和一个Subtract函数,如下所示:

Func<int, int, int> Add = (a, b) => a + b;
Func<int, int, int> Subtract = (a, b) => a - b;

如果你随后做你的作业,你可以做y = ThatFunction(x, y); ThatFunction将是你选择的任何函数的引用。

但是,您要求一种优雅的方式,这对于您面临的问题绝对不是一种优雅的方式。相反,您应该只保留一个布尔值,告诉您要执行这两个操作中的哪一个。只要您的条件为真,您就可以切换该布尔值:

bool subtract = false;
foreach (var someThing in someOtherThing)
{
    if (condition)
    {
        // toggle the current action
        subtract = !subtract;
    }
    // do something else
    // now perform the correct action
    if (subtract)
        y -= x;
    else
        y += x;
}

如您所见,condition负责切换布尔值subtract,但只有后者负责选择正确的操作。

有点。您可以做的是返回一个委托 - 这是一个包含对包含对象和方法的引用的对象,并且可以调用。

如果我正确阅读了您的问题,您希望调用一个返回另一个方法来操纵您的状态的方法。像这样的事情应该这样做:

class NoIdeaWhatTheScenarioIs {
  private int y;
  private int x;
  void Add() { y += x; }
  void Sub() { y -= x; }
  Action GetAction(bool ifTrue) { if (ifTrue) { return Add; } else { return Sub; } }
  void DoStuff(IEnumerable<Thingie> things) {
    foreach(var thing in things) {
      GetAction(thing.condition)(); // <-- note the extra parens here
    }
  }
}

因此,GetAction 返回一个 System.Action 委托,然后立即调用该委托。

如果你的意思是这样的话。 那么是的,这是可能的

int MakeCalc(int result){
     if(result == 0)
          return MakeCalcForZero(result)
     return result /3;
}
int MakeCalcForZero(int result){
    return result +100;
}

听起来你想返回一个 Func,这样你就可以对它执行。

Func<int, int, int> GetOperand(bool negate)
{
    if (negate)
        return (x, y) => { return y - x;};
    else
        return (x, y) => { return y + x; };
}

然后,您可以使用以下命令调用它:

y = GetOperand(true).Invoke(x, y);

相关内容

  • 没有找到相关文章

最新更新