如何在C#中处理大量变量

Sou*_*k21 4 c# variables

我正在制作一个关于遗传学的游戏,我偶然发现了一个"问题".(事实上​​这更像是一个问题)

我有一个DNA类,里面有很多变量,可以存储游戏中每个"生物"的信息.

public class DNA {
    float size;
    float speed;
    float drag;
    float eyeSize;
    int numberOfEyes;
    float color_r;
    [...]
}
Run Code Online (Sandbox Code Playgroud)

现在让我们想象一下我想平均两个DNA.

我可以:

DNA AverageDNAs (DNA dna1, DNA dna2) {
    DNA newDNA = new DNA ();
    newDNA.size = (dna1.size+dna2.size)/2f;
    newDNA.speed = (dna1.speed+dna2.speed)/2f;
    [...]
}
Run Code Online (Sandbox Code Playgroud)

但它似乎很长,每次我要做一些计算,我都需要逐个重写每个变量.

所以我创建了一个函数,将所有变量(归一化在0和1之间)存储到列表中

public class DNA {
    public float size;
    public float speed;
    [...]
    private List<float> tempList;
    public List<float> ToList() {
        if (tempList == null) {
        tempList = new List<float>();
        toReturn.Add (size/sizemax);
        toReturn.Add (speed/speedmax);
        [...]
        }
        return tempList
    }
    public static ADN fromList(List<float> list) {
        ADN toReturn = new ADN();
        toReturn.size = list[0]*sizemax;
        [...]
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以这样做:

DNA AverageDNAs (DNA dna1, DNA dna2) {
    List<float> dnaList1 = dna1.ToList();
    List<float> dnaList2 = dna2.ToList();
    List<float> newDNA = new List<float>();
    for (int i = 0; i<dnaList1.Count; i++) {
        newDNA.Add ((dnaList1[i]+dnaList2[i])/2f);
    }
    return DNA.fromList(newDNA);
}
Run Code Online (Sandbox Code Playgroud)

它更容易实现新的功能和计算,但它相当沉重(部分原因是列表创建),而且不是很漂亮(我猜?).

List<float>为了便于阅读,我不想只使用a .

我想知道是否有更好的方法来处理这种情况?

(请原谅我可怜的英语,因为我不是母语人士)

Lua*_*aan 8

如果您始终对所有操作应用相同的操作,则可以使用参数指定要执行的操作:

public DNA Cross(DNA dna1, DNA dna2, Func<float, float, float> operation)
{
  var newDNA = new DNA();

  newDNA.size = operation(dna1.size, dna2.size);
  newDNA.speed = operation(dna1.speed, dna1.speed);
  // And all the rest
}
Run Code Online (Sandbox Code Playgroud)

这允许您将此方法重用于各种不同的操作 - 只要它们始终在相同数量的字段上运行:

// Average
(d1, d2) => (d1 + d2) / 2f
// Sum
(d1, d2) => d1 + d2
// Random
(d1, d2) => RandomBool() ? d1 : d2
Run Code Online (Sandbox Code Playgroud)

等等

如果你想更选择性地应用操作,你也可以扩展Cross到取一个枚举指定方法哪个领域正是你想要更新.当然,您可能希望添加另一个Func(或者Action,根据您对变量参数的满意程度)以您想要的任何方式更新其余部分.