我有一个输出整数的方法:
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转换为一个整数,但这不起作用,因为它转换的是方法的名称,而不是它输出的数字。我该怎么做呢?我是否只需要额外的一层变量并在某个地方进行强制转换?
发布于 2013-06-22 05:37:36
您可以将委托作为变量。您可以向DiceLoop函数传递一个Func参数:
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);发布于 2013-06-22 05:50:00
要扩展P.S.w.g的优秀答案,您可以扩展您的掷骰子以接受多个边作为输入:
Func<int,int> getNextX = (x) => _r.Next(1,x+1);将"Func<int>“理解为”返回整数的函数“,因此"Func<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);
}这将得到单面骰子(?)中每一卷的总和。变成了一个20面的骰子。
https://stackoverflow.com/questions/17244654
复制相似问题