gpt4 book ai didi

c# - 存储大量数字字段的最佳数据结构

转载 作者:太空狗 更新时间:2023-10-30 01:01:40 26 4
gpt4 key购买 nike

我正在使用一个类,比如 Widget,它具有大量真实世界的数字属性(例如,高度、长度、重量、成本等)。有不同类型的小部件(链轮、齿轮等),但每个小部件共享完全相同的属性(当然,值因小部件而异,但它们都有重量、重量等)。我有 1,000 种每种类型的小部件(1,000 个齿轮、1,000 个链轮等)

我需要对这些属性执行大量计算(比如计算 1000 多个不同小部件的属性的加权平均值)。对于加权平均值,我对每种小部件类型都有不同的权重(即,我可能更关心链轮的长度而不是齿轮)。

现在,我将所有属性存储在每个小部件的 Dictionary 中(这些小部件有一个枚举来指定它们的类型:cog、sprocket 等)。然后我有一些计算器类将每个属性的权重存储为 Dictionary< WidgetType, Dictionary< string, double >>。要计算每个小部件的加权平均值,我只需遍历其属性字典键,例如:

double weightedAvg = 0.0;
foreach (string attibuteName in widget.Attributes.Keys)
{
double attributeValue = widget.Attributes[attributeName];
double attributeWeight = calculator.Weights[widget.Type][attributeName];
weightedAvg += (attributeValue * attributeWeight);
}

所以这工作正常并且非常可读且易于维护,但是对于基于某些分析的 1000 多个小部件来说速度非常慢。我的属性名称范围是已知的,并且在应用程序的生命周期内不会改变,所以我想知道有哪些更好的选择。我能想到的几个:

1) 将属性值和权重存储在双 [] 中。我认为这可能是最有效的选择,但我需要确保数组始终以正确的顺序存储在小部件和计算器之间。这也将数据与元数据分离,因此我需要在某处存储一个数组(?),该数组将属性名称和索引映射到属性值和权重的双 [] 中。

2) 将属性值和权重存储在不可变结构中。我喜欢这个选项,因为我不必担心排序问题,而且数据是“ self 记录”的。但是有没有一种简单的方法可以在代码中循环遍历这些属性?我有将近 100 个属性,所以我不想在代码中对所有这些进行硬编码。我可以使用反射,但我担心这会导致更大的惩罚,因为我循环了这么多小部件并且必须在每个小部件上使用反射。

还有其他选择吗?

最佳答案

立即想到三种可能性。第一个,我认为你太容易拒绝了,是在你的类(class)中有单独的领域。即个人double名为 height 的值, length , weight , cost等。你是对的,它会是更多的代码来进行计算,但你不会有字典查找的间接。

其次是放弃字典,转而使用数组。所以而不是 Dictionary<string, double> ,你只需要一个 double[] .再一次,我认为你拒绝得太快了。您可以轻松地将字符串字典键替换为枚举。所以你会:

enum WidgetProperty
{
First = 0,
Height = 0,
Length = 1,
Weight = 2,
Cost = 3,
...
Last = 100
}

鉴于此和 double 的数组,您可以轻松浏览每个实例的所有值:

for (int i = (int)WidgetProperty.First; i < (int)WidgetProperty.Last; ++i)
{
double attributeValue = widget.Attributes[i];
double attributeWeight = calculator.Weights[widget.Type][i];
weightedAvg += (attributeValue * attributeWeight);
}

直接数组访问将比通过字符串访问字典快得多。

最后,您可以稍微优化一下字典访问。而不是做 foreach在键上然后进行字典查找,执行 foreach在字典本身:

foreach (KeyValuePair<string, double> kvp in widget.Attributes)
{
double attributeValue = kvp.Value;
double attributeWeight = calculator.Weights[widget.Type][kvp.Key];
weightedAvg += (attributeValue * attributeWeight);
}

关于c# - 存储大量数字字段的最佳数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37686285/

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