我有一个输出整数的方法:
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,但这不起作用,因为它正在转换方法的名称,而不是它吐出的数字。我该怎么做呢?我只需要一个额外的变量层并在某处投射吗?
答案 0 :(得分:13)
你可以将委托作为变量。您可以将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(a.k.a匿名函数):
Func<int> getNext = () => _r.Next(1, 7);
DiceLoop(getNext);
答案 1 :(得分:2)
为了扩展p.s.w.g的优秀答案,你可以扩展你的骰子滚轮以接受许多方面作为输入:
Func<int,int> getNextX = (x) => _r.Next(1,x+1);
将“Func<int>
”读作“返回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);
}
这将为您提供从单面模具(?)到20面模具各一卷的总和。