简化冗余变量分配

时间:2015-04-22 01:12:57

标签: c# random simplify

我不喜欢这段代码,它过于复杂且不切实际,所以我希望简化它。

我希望它以随机量更改var,我需要在此代码中至少放置150个变量。

//Variable list

public double price1 = 100;
public double price2 = 100;
public double price3 = 100;

public void DaysEnd(){ //Simplified version of inefficient code

var = price1;
HVariation();
price1 = newvar;

var = price2;
HVariation();
price2 = newvar;

var = price2;
MVariation();
price2 = newvar;

var = price3;
LVariation();
price3 = newvar;
}

public void Hvariation(){
    newvar = var + (var * (Random.NextDouble(0 - 0.5, 0.5)));
}
public void Mvariation(){
    newvar = var + (var * (Random.NextDouble(0 - 0.25, 0.25)));
}
public void Lvariation(){
    newvar = var + (var * (Random.NextDouble(0 - 0.1, 0.5)));
}

3 个答案:

答案 0 :(得分:2)

这应该让你入门

List<double> values = new List<double> { 100, 100, 200, 500, ... };
values = values.Select(val => Hvariation(val)).ToList();
// now all values have been altered by Hvariation

...
private readonly Random _rand = new Random();

public double Hvariation(double val) {
    return val + (val * (_rand.NextDouble(-0.5, 0.5)));
}

答案 1 :(得分:0)

首先要做的是找到重复的代码。例如:

var = price3;
LVariation(); //Different variations
price3 = newvar;

这可以变成一种方法(将变化作为参数)。 要做到这一点,您还需要制作一个默认变体,它采用最小值和最大值:

public void Variation(double min, double max){
    newvar = var + (var * (Random.NextDouble(min, max)));
}

然后你可以将它们放在一起以减少代码,看起来像这样:

public double UpdatePrice(double price, double min, double max)
{
    var = price;
    Variation(min, max);
    return newvar;
}

一般情况下,如果我必须多次复制代码(如果复制的数量很大,甚至一次),我将代码转换为方法。

答案 2 :(得分:0)

您可以通过定义三种变体方法,定义变体级别并将其传递到单个方法中来简化此操作。我不确定你是否需要它在数组中或者如果你可以使用列表(在这种情况下列表更可取),但你可以将变量存储在一个数组中,而不是为每个变量定义一个变量名称,根据需要将它们分成逻辑分组。然后,您可以使用LINQ将更改/转换应用于每个阵列。这方面的一个例子是

    public enum VariationLevel
    {
        High,
        Medium,
        Low
    };
    public double[] HighVariancePrices =
    {
        100, 100, 100, 100, 100
    };
    public double[] MediumVariancePrices =
    {
        100, 100, 100, 100, 100
    };
    public double[] LowVariancePrices =
    {
        100, 100, 100, 100, 100
    };


    public void DaysEnd()
    {
        HighVariancePrices = HighVariancePrices.Select(price => GetVariation(price, VariationLevel.High)).ToArray();
        MediumVariancePrices = MediumVariancePrices.Select(price => GetVariation(price, VariationLevel.Medium)).ToArray();
        LowVariancePrices = LowVariancePrices.Select(price => GetVariation(price, VariationLevel.Low)).ToArray();
    }

    public double GetVariation(double value, VariationLevel variationLevel)
    {
        switch (variationLevel)
        {
            case VariationLevel.High:
                return value + (value * (Random.NextDouble(0 - 0.5, 0.5)));
            case VariationLevel.Medium:
                return value + (value * (Random.NextDouble(0 - 0.25, 0.25)));
            case VariationLevel.Low:
                return value + (value * (Random.NextDouble(0 - 0.1, 0.5)));
        }
    }

然而,Random.NextDouble()周围的代码没有编译(因为NextDouble没有参数)所以我不确定你在那里尝试做什么,但是这超出了&#34;我如何简化代码?&#34;希望这会有所帮助。