c# – 用于存储大量数字字段的最佳数据结构
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 用于存储大量数字字段的最佳数据结构,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2707字,纯文字阅读大概需要4分钟。
内容图文
我正在使用一个类,比如Widget,它具有大量的数字真实世界属性(例如,高度,长度,重量,成本等).有不同类型的小部件(链轮,齿轮等),但每个小部件共享完全相同的属性(当然,小部件的值会有所不同,但它们都有重量,重量等).我有1000种每种类型的小部件(1,000个齿轮,1,000个链轮等)
我需要对这些属性执行大量计算(比如计算1000个不同小部件的属性的加权平均值).对于加权平均值,我对每种小部件类型都有不同的权重(即,我可能更关心链轮的长度而不是齿轮的长度).
现在,我将所有属性存储在Dictionary< string,double>在每个小部件中(小部件具有指定其类型的枚举:cog,sprocket等).然后,我有一些计算器类,将每个属性的权重存储为字典< 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)以double [] s存储属性值和权重.我认为这可能是最有效的选择,但我需要确保数组始终以小部件和计算器之间的正确顺序存储.这也将数据与元数据分离,因此我需要将属性名称和索引之间的数组(?)存储在属性值和权重的double []中.
2)将属性值和权重存储在不可变结构中.我喜欢这个选项,因为我不必担心排序,数据是“自我记录”.但是有一种简单的方法可以在代码中循环这些属性吗?我有近100个属性,所以我不想硬编码代码中的所有属性.我可以使用反射,但我担心这会导致更大的惩罚,因为我循环了这么多的小部件,并且必须在每个小部件上使用反射.
还有其他选择吗?
解决方法:
立即想到三种可能性.第一个,我认为你太容易拒绝了,就是在你班上有个别的领域.也就是说,单个双精度值称为高度,长度,重量,成本等.你是正确的,它将是更多的代码来进行计算,但你不会有字典查找的间接.
其次是放弃字典而不是数组.因此,而不是字典< 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# – 用于存储大量数字字段的最佳数据结构全部内容,希望文章能够帮你解决c# – 用于存储大量数字字段的最佳数据结构所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。