gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:02:46 24 4
gpt4 key购买 nike

我正在制作一个关于遗传学的游戏,但我遇到了一个小“问题”。 (其实更像是一个问题)

我有一个包含大量变量的 DNA 类,用于存储游戏中每个“生物”的信息。

public class DNA {
float size;
float speed;
float drag;
float eyeSize;
int numberOfEyes;
float color_r;
[...]
}

现在假设我想对两个 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;
[...]
}

但是看起来挺长的,而且每次我要进行一些计算时,我都需要一个一个地重写每个变量。

所以我做了一个函数,将所有变量(在 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;
[...]
}
}

现在,我可以:

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

实现新函数和计算更容易,但它相当繁重(部分原因是列表创建),而且不是很漂亮(我猜?)。

我不喜欢只使用 List<float>为了可读性。

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

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

最佳答案

如果您总是对所有人应用相同的操作,您可以使用参数来指定要执行的操作:

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
}

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

// Average
(d1, d2) => (d1 + d2) / 2f
// Sum
(d1, d2) => d1 + d2
// Random
(d1, d2) => RandomBool() ? d1 : d2

等等

如果您确实想更有选择性地应用该操作,您还可以扩展 Cross 方法以采用一个枚举来指定您要更新的哪些字段。当然,您可能想要添加另一个 Func(或 Action,具体取决于您对可变参数的适应程度)以您想要的任何方式更新其余部分。

关于c# - 如何在C#中处理大量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31428895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com