使用方法作为可变
我有输出的整数的方法:使用方法作为可变
public int Random6()
{
int n = _r.Next (1, 7);
return n;
}
我有一个循环调用该方法:
public static void DiceLoop()
{
int result = 0;
for(int i = 0; i < maxDice; i++)
{
result += Random6;
}
Console.WriteLine (result);
}
我希望能够写循环一次,然后使用变量名称传递多个方法。例如:
public static void DiceLoop()
{
int result = 0;
for(int i = 0; i < maxDice; i++)
{
result += diceType;
}
Console.WriteLine (result);
}
哪里diceType
是将使用if
保持功能的方法名称的变量。我知道我不能只有一个方法作为变量。我试图让diceType
一个字符串并将其传递给循环,但因为Random6
给出了一个int
它不会工作。我尝试将diceType
转换为int类型,但这不起作用,因为它是投射方法的名称,而不是它所吐出的数字。我应该如何去做这件事?我是否只需要一层额外的变量并在某处投射?
你可以有一个委托作为一个变量。你可以通过一个Func<int>
参数到您的DiceLoop
功能:
public static void DiceLoop(Func<int> getNext)
{
int result = 0;
for(int i = 0; i < maxDice; i++)
{
result += getNext();
}
Console.WriteLine (result);
}
然后你就可以调用这个样:
DiceLoop(Random6);
这只是解决您的特定情况下,最简单的方法。如果你想说的话,创建一个变量,并为它分配引用一个代表,你可以这样做:
Func<int> getNext = Random6;
DiceLoop(getNext);
你甚至可以使用lambda expressions(又名匿名函数)是这样的:
Func<int> getNext =() => _r.Next(1, 7);
DiceLoop(getNext);
看起来真的很干净,我想它工作得很好,但我太小白,实际上将它实现到我的代码中。感谢您提供正确的答案。我会研究那里的所有东西,并希望弄清楚如何使它工作。 – AmazingMrBrock
但我找到了解决办法,并不需要我将'Random6'方法更改为另一种方法。相反,我只是改变其他方法的变量。简单和小菜友好。感谢您的帮助:) – AmazingMrBrock
要延长PSWG出色的答案,你可以扩展你的骰子滚子接受一个边数为输入:是R
Func<int,int> getNextX = (x) => _r.Next(1,x+1);
读“Func<int>
”为“功能eturns int“,因此 ”Func<int,int>
“是一个”将int作为参数并返回int的函数“。
然后,DiceLoop应该是这样的:
public static void DiceLoop(Func<int,int> roller)
{
int result = 0, maxDice = 20;
for(int i = 1; i <= maxDice; i++)
{
result += roller(i);
}
Console.WriteLine (result);
}
这将使你从1个骰到20面的骰子每一个卷的总和(?)。
小修正:。下一个()为六面骰子必须使用参数(1,7)。一个d8需要(1,9),一个d10需要(1,11),d12是(1,13),d20是(1,21)等。他可能想要接受边数作为参数并为呼叫添加一个。 –
另外:在这一点上,为什么甚至使用委托?首先,只是参与方的数量。但我应该向OP提出这个问题。 –
为什么要使用委托?因为它可以让你改变你的随机性来源。目前您正在使用内置的伪RNG(_r),但您可能希望委托给真正的随机源。 –
你可以创建一个'Dice'类/接口,它有一个方法来检索一个随机值(首选),或者传入一个方法委托。 –
“DiceLoop”如何运作?你的意思是'result + = Random6()'? –
为什么不只是'int RollDice(int numDice,int numSides){return Enumerable.Range(0,numDice).Sum(r.Next(1,numSides + 1));}'? –