具有命名的双精度列的表格数据结构的最佳方式

时间:2012-06-21 05:34:54

标签: c# data-structures thread-safety c#-2.0

我正在搜索这样的数据结构:

position      whoCares    bla           ...
200.001890     -0.00110    -0.100000
199.997990     0.000790    -2.200000
199.952110     0.026330    -28.900000
199.780060     0.116370    -60.400000
199.321650     0.349330    -154.200000
198.242900     0.901430    -248.700000
196.447890     1.816030    -289.200000
...            ...         ...

通过添加标记或向列添加新数据,表可以在两个维度上增长。数据大小从3-20列到每列100-10000双。

这应该被定义为一个数据集作为一个类实例。 数据访问应如下所示:

double[] Get(string tag)             // data.Get("position")
double Get(string tag, int index)    // data.Get("position", 17)
...

到目前为止,只需使用Dictionary<string, double[]>Dictionary<string, List<double>>即可轻松实现。

现在这必须是线程安全的,它应该具有良好的性能。但简单的数据访问比性能更重要。

请注意,double[] Get(...)会返回内部数据的副本,因为返回引用会导致多线程方案出现问题。通常会有一位作家和1-3位读者。

我尝试了一些内容,例如Dictionary<string, double[]>double[]List<double>

最好的方法是什么?是否有使用C#2.0的其他数据容器/结构?


编辑:

此类应充当由一个写入器线程填充的数据容器,该线程从硬件读取所有数据。在应用程序运行时,UI线程只是为了绘制图表而读取该数据。

第二个场景是以前的编写器线程,但是UI线程被一个线程替换,该线程对该数据执行计算并将结果存储在第二个数据实例中,然后由UI显示。

1 个答案:

答案 0 :(得分:1)

另一种方法是使用多维数组。这可能会更好。

object[] table = new object[2];
table[0] = new string[x]; // Tags
table[0][0] = "tag";  // Example for a tag, you may iterate it

object[] doubles = new object[x];
doubles[0] = new double[y]; // Example for a column, you may iterate it

table[3] = doubles; // Doubles table

通过这种方式,您将在另一个数组中拥有两个数组。

注意x =列数,y =行数。