使用方法作为可变

问题描述:

我有输出的整数的方法:使用方法作为可变

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

你可以创建一个'Dice'类/接口,它有一个方法来检索一个随机值(首选),或者传入一个方法委托。 –

+2

“DiceLoop”如何运作?你的意思是'result + = Random6()'? –

+0

为什么不只是'int RollDice(int numDice,int numSides){return Enumerable.Range(0,numDice).Sum(r.Next(1,numSides + 1));}'? –

可以有一个委托作为一个变量。你可以通过一个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); 
+0

看起来真的很干净,我想它工作得很好,但我太小白,实际上将它实现到我的代码中。感谢您提供正确的答案。我会研究那里的所有东西,并希望弄清楚如何使它工作。 – AmazingMrBrock

+0

但我找到了解决办法,并不需要我将'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

小修正:。下一个()为六面骰子必须使用参数(1,7)。一个d8需要(1,9),一个d10需要(1,11),d12是(1,13),d20是(1,21)等。他可能想要接受边数作为参数并为呼叫添加一个。 –

+1

另外:在这一点上,为什么甚至使用委托?首先,只是参与方的数量。但我应该向OP提出这个问题。 –

+1

为什么要使用委托?因为它可以让你改变你的随机性来源。目前您正在使用内置的伪RNG(_r),但您可能希望委托给真正的随机源。 –