1

我有一个输出整数的方法:

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

WherediceType是一个变量,它将使用if函数保存方法名称。我知道我不能只拥有一个方法作为变量。我尝试制作diceType一个字符串并将其传递给循环,但是因为Random6给出了int它不起作用。我尝试转换diceType为 int,但这不起作用,因为它转换的是方法的名称,而不是它吐出的数字。我该怎么做呢?我只需要一层额外的变量并在某处进行转换吗?

4

2 回答 2

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 表达式(又名匿名函数):

Func<int> getNext = () => _r.Next(1, 7);
DiceLoop(getNext);
于 2013-06-21T21:37:35.500 回答
2

要扩展 pswg 的出色答案,您可以扩展掷骰子以接受多个面作为输入:

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

这将为您提供从 1 面骰子 (?) 到 20 面骰子的每个掷骰的总和。

于 2013-06-21T21:50:00.450 回答